基于子查询的T-SQL更新
我在使用子查询进行更新时遇到了一个问题,子查询应该根据更新单元格行中的某个键返回值。通常情况下,它将使用如下表:基于子查询的T-SQL更新,sql,sql-server,sql-update,subquery,Sql,Sql Server,Sql Update,Subquery,我在使用子查询进行更新时遇到了一个问题,子查询应该根据更新单元格行中的某个键返回值。通常情况下,它将使用如下表: ╔══════════════════════════════╗ ║ Key1 Key2 Value Other ║ ╠══════════════════════════════╣ ║ Key11 Key21 Val1 Other1 ║ ║ Key12 Key22 Val2 Other2 ║ ║ Key13 Key23 Val3 Othe
╔══════════════════════════════╗
║ 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
另一种情况是基于另一个表更新一个表
假设表1
为
╔═════════════════╗
║ Key Value ║
╠═════════════════╣
║ Key1 Val1 ║
║ Key2 Val2 ║
║ Key3 Val3 ║
║ Key4 Val4 ║
╚═════════════════╝
和表2
╔══════════════════════╗
║ 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
再次,外部,其中
在子查询中看不到键。如果我在没有外部的情况下执行此操作,其中
在这两种情况下,我都会得到一个错误,即子查询返回多个不允许的值
如果它是一个INSERT
语句而不是UPDATE
语句,那么在没有第二个WHERE
的情况下,这实际上是可行的,我唯一能让它用于更新的方法就是使用循环或游标
第三种情况的概要是,如果我有一个结果集(Key,Value),它的值对和我在表中的行数一样多,并且希望根据集合中的“Key”和要更新的行中的某个键将“Value”分配给更新的列。您可以使用这种语法
update table1
set whatever
from table1 join table2 on something
join (subquery goes here) temp on something
对于第一种情况,我不明白为什么需要子查询,它与以下情况不一样:
UPDATE Table
SET Value = Other
WHERE Key2 IN ("SOME CONSTRAINT")
AND Key1 = Key2
第二次更新
可以通过连接来完成:
UPDATE T1
SET T1.Value = T2.Value
FROM Table1 T1
INNER JOIN Table2 T2
ON T1.Key = T2.OtherKey
您是否考虑过将UPDATE
与JOIN
结合使用?这是一种由经验不足的开发人员构建sql查询的常见方法。他们试图将数据集构建成查询并将它们“粘合”在一起,而通常通过更简洁的语法和语义可以实现相同的结果。好吧,实际案例要复杂一些,我只是尝试做一些简单的说明。仍然非常感谢,没有考虑在更新中使用连接。另外,我是否可以(以及如何)使用WITH或类似的语法,以便子查询为我提供要使用的值和要匹配的键?