我有以下表格
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的ID,其中
Ta_A.VAL = 'val_x' and Table_A.COUNTRY_ID = Table_B.COUNTRY_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'
将有多个值。以上是什么权利?
最佳答案
好吧,实际上这只是以下更新查询:
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;
看到它在sqlfiddle中实时运行
您说,这个(您写的太复杂了)不能使用,因为它将在您的子查询中返回多个值。 (暗示未来,请在样本数据中反映此类情况。样本数据用于测试所有(边缘)情况)。
在这种情况下,显然您需要在
TabB
中添加更多条目,并且简单的更新将不起作用,除非您要在一个列中存储多个条目。请勿这样做,因为它违反了第一个范式(如果您不了解我在说什么,请阅读有关范式的信息)。无论如何,鉴于您的样本数据很少,最大的问题是,您为什么要打扰?最合乎逻辑的事情是合并这两个表。
TabB
中存储的其他任何信息都取决于键country_id
,该键在TabA
中是多余的。我的建议,重新考虑您的数据库设计。