问题描述
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”(在子查询之前)。