2014-02-21 83 views
3

我在使用子查詢進行更新時遇到了問題,其中子查詢應基於更新的單元格的某一行中的某個鍵返回值。通常,將與表如下工作:基於子查詢的T-SQL更新

╔══════════════════════════════╗ 
║ 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之一,只有這樣,我設法得到這個工作的更新是與循環或光標。

第三種情況的概要將是如果我有一個結果集像(鍵,值)與儘可能多的值對,因爲我有更新的表中的行,並且想要將「值」分配給更新的列從集合上的「Key」和從行中的一些關鍵字被更新。

+0

你有沒有看使用'UPDATE'用'JOIN'? – TTeeple

+0

這是一種常見的方式來考慮由缺乏經驗的開發人員構建sql查詢。他們試圖將他們的數據集建立到查詢中,並將它們「粘合」在一起,而通常使用更簡潔的語法和語義可以達到相同的結果。 –

回答

1

你可以使用這個語法

update table1 
set whatever 
from table1 join table2 on something 
join (subquery goes here) temp on something 
9

對於第一種情況,我不明白爲什麼需要子查詢,也不會是完全一樣的:

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 
+0

實際情況稍微複雜一些,我只是試圖做出簡單的插圖。還是非常感謝,沒有考慮在更新中使用連接。 另外,我可以(以及如何)使用WITH或一些類似的語法,以便子查詢給我使用的價值和密鑰匹配? – user1493545