我有以下表格

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中是多余的。我的建议,重新考虑您的数据库设计。

10-08 16:31