Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于子查询的T-SQL更新_Sql_Sql Server_Sql Update_Subquery - Fatal编程技术网

基于子查询的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或类似的语法,以便子查询为我提供要使用的值和要匹配的键?