我有下表
TAB_A
id | COUNTRY_ID | VAL
1 | 1 | val_x
2 | 1 | val_y
3 | 1 | val_z
4 | 2 | val_x
5 | 2 | val_y
6 | 2 | val_z
Tab_B.id_tab_A当前存储来自TAB_A的Ta_A.VAL = 'val_x' and Table_A.COUNTRY_ID = Table_B.COUNTRY_ID
的ID。例如,TAB_B(1,1,1)表示TABLE_B(id = 1)=> TABLE_A(1,1,val_x)
OLD TAB_B
id | COUNTRY_ID | id_tab_A
1 | 1 | 1
2 | 2 | 4
我想替换所有TAB_B.id_val_A,以便:
if TAB_B.id_val_A is equal to the id for TAB_A.VAL = 'val_x'
it becomes id for TAB_A.VAL = 'val_x'
当然COUNTRY_ID也必须相等
NEW TAB_B
id | COUNTRY_ID | id_tab_A
1 | 1 | 2
2 | 2 | 5
我不能使用2个查询,因为COUNTRY_ID
没有修复(可以是任何其他等等3,4,5):
UPDATE TAB_B tb, TAB_A ta
SET tb.id_tab_A = (SELECT ta.id FROM ta WHERE ta.COUNTRY_ID = 1 AND tb.VAL = 'val_y')
WHERE ta.VAL = 'val_x' AND ta.COUNTRY_ID = tb.COUNTRY_ID;
UPDATE TAB_B tb, TAB_A ta
SET tb.id_tab_A = (SELECT ta.id FROM ta WHERE ta.COUNTRY_ID = 1 AND tb.VAL = 'val_y')
WHERE ta.VAL = 'val_x' AND ta.COUNTRY_ID = tb.COUNTRY_ID;
我无法使用:
UPDATE TAB_B tb, TAB_A ta
SET tb.id_tab_A = (SELECT ta.id FROM ta WHERE ta.COUNTRY_ID = tb.COUNTRY_ID AND tb.VAL = 'val_y')
WHERE ta.VAL = 'val_x' AND ta.COUNTRY_ID = tb.COUNTRY_ID;
因为内部选择SELECT ta.id FROM ta WHERE ta.COUNTRY_ID = tb.COUNTRY_ID AND tb.VAL = 'val_y'
会有多个值。
上面的权利是什么?
答案 0 :(得分:0)
嗯,实际上它只是这个更新查询:
UPDATE TabA ta
INNER JOIN TabB tb ON ta.COUNTRY_ID = tb.COUNTRY_ID AND ta.VAL = 'val_y'
SET tb.id_tab_A = ta.id;
你说,这个(你写的相同太复杂了)不能使用,因为它会在你的子查询中返回多个值。 (提示未来,在样本数据中反映这种情况。样本数据用于测试所有(边缘)情况)
在这种情况下,您显然需要TabB
中的更多条目,并且简单的更新不会起作用,除非您想在一列中存储多个条目。不要这样做,它违反了第一个正常形式(如果你不知道我在说什么,请阅读关于规范化的内容)。
无论如何,给你的小样本数据提出的一个重要问题是,你为什么要打扰?最合乎逻辑的做法是合并这两个表。 TabB
中存储的其他信息取决于country_id
中冗余的密钥TabA
。我的建议,重新考虑你的数据库设计。