MYSQL Update查找匹配条件的外键并替换它们匹配不同条件的外键

时间:2014-07-25 06:20:15

标签: mysql sql

我有下表

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'会有多个值。

上面的权利是什么?

1 个答案:

答案 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。我的建议,重新考虑你的数据库设计。