基于子查询的T-SQL更新

时间:2014-02-21 19:34:40

标签: sql sql-server sql-update subquery

我遇到了使用子查询进行更新的问题,其中子查询应根据更新单元格中的某些键返回值。通常它会使用这样的表:

╔══════════════════════════════╗
║ 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”和要更新的行中的一些键。

2 个答案:

答案 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