2017-02-14 9 views
0

副選択クエリから複数の行(7)で複数の列(2)を更新する必要があるという問題があります。ここで SQL副選択クエリで複数の行と列を更新する

は、私がこれまで持っているものです。

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

をしかし、私は私が得ること実行させたときにSQLCODE = -811、SQLSTATE = 21000

(埋込みSELECT文または副選択の結果更新声明の設定理由は、1つ以上の行の表であるか、または基本的な予定表のサブキーの結果が1つ以上の値である)

私の誤りはどこですか?それは、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

エラーメッセージはかなり明確です。サブSELECTは、指定した条件を指定して1行を返す必要があります。 'commandtbl3'の行を一意に識別する方法を見つける – mustaccio

+0

commandtb2とcommandtbl3の行数はいくつですか?あなたはいくつかしか持っていないようですので、その値を見ることができるように行をあなたの質問に編集できますか? – user2338816

答えて

-1

使っ参加:

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

問題はおそらく述べたように、あなたはそれ以上の列の値を1行(または複数)を更新してみてください。

+0

SQLCODE = -104、SQLSTATE = 42601が表示され、このコンテキストでJOBIN – Thevagabond

-1

私はあなたの最初のバージョンが動作するはずだと思います。しかし、別のアイディアがあります:

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

DB2のバージョンは重要です。

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を持っているでしょうV10では、次の2つのサブクエリが必要な場合があります。

+0

t2.attrが無効になる前にFROMが見つからないことが通知されます。 SQLCODE = -206、SQLSTATE = 42703 – Thevagabond

+0

DB2を使用していますか? –

+0

DB2 v10.5 Windows。 – Thevagabond

関連する問題