2017-02-14 100 views
0

我有需要從子查詢查詢更新多行(7)多行(7)的問題。使用子查詢查詢更新多個行和列

這是我到目前爲止有:

UPDATE commandtbl2 t1 
SET (attr, attr2) = (
SELECT attr, attr2 
FROM commandtbl3 t2 
WHERE t1.cmd=t2.cmd 
); 

然而,當我讓那跑,我得到SQLCODE = -811,SQLSTATE = 21000

(嵌入式SELECT語句或子選擇的結果在更新聲明的集合條款中是超過一行的表格,或者基本預測的子查詢的結果是超過一個值)

我的錯誤在哪裏?它應該改變3行中的2列,並保留其他行。我只能使用SQL,所以沒有Java,PHP等。

由於這是DB2解決方案,我已經在網上找到,如:

UPDATE commandtbl2 t1 
SET attr = t2.attr, attr2=t2.attr2 
FROM commandtbl2 t1 
JOIN commandtbl3 t2 
ON t1.cmd = t2.cmd ; 

或者

UPDATE 
commandtbl2 t1 
JOIN 
commandtbl3 t2 ON t1.cmd=t2.cmd 
SET 
t1.attr = t2.attr, 
t1.attr2=t2.attr2; 

不工作,但拋出異常。

感謝您的幫助。

TheVagabond

+0

[SQL更新查詢使用連接]的可能重複(http://stackoverflow.com/questions/982919/sql-update-query-using-joins) – HoneyBadger

+1

錯誤消息非常清晰 - 您更新第1行時間,所以在你提供的條件下,子查詢必須返回一行。在'commandtbl3'中找到唯一標識行的方法 – mustaccio

+0

commandtb2和commandtbl3中有多少行?看起來你只有幾個,所以你可以編輯你的問題的行,以便我們可以看到他們的價值觀? – user2338816

回答

-1

使用JOIN:

UPDATE commandtbl2 t1 JOIN commandtbl3 t2 ON t1.cmd=t2.cmd SET t1.attr=t2.attr, t1.attr2=t2.attr2; 

問題很可能是因爲說,你嘗試用更多的行的值更新一行(或多個)。

+0

我得到SQLCODE = -104,SQLSTATE = 42601,它告訴我,FROM在JOIN – Thevagabond

-1

我認爲你的第一個版本應該可以工作。但這裏有另外一個想法:

UPDATE commandtbl2 
    SET attr = t2.attr, attr2 = t2.attr2 
    FROM commandtbl3 t2 
    WHERE commandtbl2.cmd = t2.cmd ; 

DB2的版本很重要。在V10,你可能需要兩個子查詢:

UPDATE commandtbl2 
    SET attr = (SELECT t2.attr FROM commandtbl3 t2 WHERE commandtbl2.cmd = t2.cmd FETCH FIRST 1 ROW ONLY), 
     attr2 = (SELECT t2.attr2 FROM commandtbl3 t2 WHERE commandtbl2.cmd = t2.cmd FETCH FIRST 1 ROW ONLY); 

注:通常使用FETCH FIRST 1 ROW ONLY時,你將有一個ORDER BY

+0

t2.attr在此上下文中無效之前丟失。 SQLCODE = -206,SQLSTATE = 42703 – Thevagabond

+0

您確定您使用的是DB2嗎? –

+0

DB2 v10.5 Windows。 – Thevagabond