我遇到了使用子查询进行更新的问题,其中子查询应根据更新单元格中的某些键返回值。通常它会使用这样的表:
╔══════════════════════════════╗
║ Key1 Key2 Value Other ║
╠══════════════════════════════╣
║ Key11 Key21 Val1 Other1 ║
║ Key12 Key22 Val2 Other2 ║
║ Key13 Key23 Val3 Other3 ║
║ Key14 Key24 Val4 Other4 ║
╚══════════════════════════════╝
我想做点什么:
UPDATE Table T1
SET T1.Value = (SELECT T2.Other
FROM Table T2
WHERE T2.Key2 IN ("SOME CONSTRAINT"))
WHERE T1.Key1 = T2.Key2
我知道这不行。外部where子句无法看到T2.Key2
。
其他情况是根据其他表更新一个表。
说Table1
是
╔═════════════════╗
║ Key Value ║
╠═════════════════╣
║ Key1 Val1 ║
║ Key2 Val2 ║
║ Key3 Val3 ║
║ Key4 Val4 ║
╚═════════════════╝
Table2
╔══════════════════════╗
║ OtherKey OtherValue ║
╠══════════════════════╣
║ Key1 Val1 ║
║ Key2 Val2 ║
║ Key3 Val3 ║
║ Key4 Val4 ║
╚══════════════════════╝
我想再做一些像
这样的事情UPDATE Table1 T1
SET T1.Value = (SELECT T2.Value
FROM Table2 T2
WHERE "SOME CONDITION")
WHERE T1.Key = T2.OtherKey
再次外部WHERE
无法在子查询中看到该键。如果我在两种情况下都没有外部WHERE
,那么我会收到错误,即子查询会返回多个不允许的值。
如果它是一个WHERE
语句而不是INSERT
语句,这实际上没有第二个UPDATE
,只有我设法让UPDATE工作的方法是使用循环或游标。
第三种情况变化的概要是,如果我有一个像(Key,Value)这样的结果集,其值对与我要更新的表中的行一样多,并希望根据更新的列分配“Value”来自set的“Key”和要更新的行中的一些键。
答案 0 :(得分:14)
对于第一种情况,我不明白为什么需要子查询,不会像以下那样:
UPDATE Table
SET Value = Other
WHERE Key2 IN ("SOME CONSTRAINT")
AND Key1 = Key2
第二个UPDATE
可以使用JOIN
:
UPDATE T1
SET T1.Value = T2.Value
FROM Table1 T1
INNER JOIN Table2 T2
ON T1.Key = T2.OtherKey
答案 1 :(得分:1)
您可以使用此语法
update table1
set whatever
from table1 join table2 on something
join (subquery goes here) temp on something