如何更新 MySQL(AuroraDB) 中的多行?

问题描述

               Table Mapper
|-------------------------------------------|
|   id    |   info_fk   |       reg_fk      |
|    1    |     100     |                   |
|    2    |     101     |                   |
|    3    |     101     |                   |
|    4    |     102     |                   |
|    5    |     102     |                   |
|    6    |     103     |                   |
|-------------------------------------------|

       Table Region
|---------------------------|
|   id    |     region_id   |
|    1    |       A101      |
|    2    |       A102      |
|    3    |       A301      |
|    4    |       B101      |
|---------------------------|

             Table Info
|--------------------------------------|
|   id     |          address          |
|   100    |           A101            |
|   101    |         A102;A101         |
|   102    |         A301;B101         |
|   103    |           B101            |
|--------------------------------------|

我想映射信息表的 id 并填充表 Mapper。上面的示例,我想要的输出是使表 Mapper

                Table Mapper
|-------------------------------------------|
|   id    |   info_fk   |       reg_fk      |
|    1    |     100     |         1         |
|    2    |     101     |         1         |
|    3    |     101     |         2         |
|    4    |     102     |         3         |
|    5    |     102     |         4         |
|    6    |     103     |         4         |
|-------------------------------------------|

这个。 reg_fk 表示表Region的ID,我根据表Info选择reg_fk。表 Mapper 已经根据表 Info 的地址数量存在,所以我要做的就是读取 Info 的地址并输入正确的映射器的 ID。

这个 sql 是我试过的:

with region_info (region_id,info_id) as (
    select region.id as region_id,info.id as info_id
    from Region region
             inner join Info info on
            info.address like concat(concat('%',region.region_id),'%')
)
update Mapper mapper inner join Info info
    on info_fk = info.id
set mapper.reg_fk = (
    case
        when info_fk = info.id then
            (select region_id
             from region_info
             where region_info.info_id = info.id
            )
        end
    )
where region_info.info_id = info.id;

它发出错误,我知道我在设置mapper.reg_fk时犯了一个错误,有多行我无法将一个“mapper.reg_fk行”设置为多行。但是在这sql 语句中,如果我在 info_fk = info.id 上加入 info 和 mapper,那么我也应该返回多行。就像在这个例子中一样, info_fk = 100 不会产生任何错误,但 info_fk = 101 然后更新 101 返回 2 行。而且在 case 语句中,我也得到了 2 行(region_id 1 和 2)所以它就像

with join restriction,what to update in table Mapper
|-------------------------------------------|
|   id    |   info_fk   |       reg_fk      |
|    2    |     101     |                   |
|    3    |     101     |                   |
|-------------------------------------------|

what appears in case sentence
|--------------------|
|       reg_fk       |
|          1         |
|          2         |
|--------------------|

我想将 reg_fk 正确更新到表 Mapper。我该怎么做?

在这里您可以简单地构建我的示例数据并测试我的代码(现在无法正常工作)。 http://sqlfiddle.com/#!9/8c0c7d/4

谢谢。

解决方法

with region_info (region_id,info_id) as (
    select region.id as region_id,info.id as info_id
    from Region region
             inner join Info info on
            info.address like concat(concat('%',region.region_id),'%')
)
update Mapper mapper inner join Info info
    on info_fk = info.id inner join region_info on info.id = region_info.info_id
set mapper.reg_fk = (
            (select region_id
             from region_info
             where region_info.info_id = info.id
             LIMIT 1
            )
        )

last "where region_info.info_id = info.id;"超出子查询。 region_info 在子查询中。所以它找不到region_info。虽然你使用了“with”子句,但如果它在“from”子句中,你就找不到它。

并且您可以使用“LIMIT 1”或“any”(在子查询之前)。