SQL update select結合文の詳細と応用

2672 ワード

SQL update select結合文の詳細と応用
SQL update select文
最も一般的なupdate構文は、次のとおりです.
1
2
UPDATE TABLE_NAME
SET column_name1 = VALUE WHRER column_name2 = VALUE

もし私の更新値Valueが1つのselect文から出てきて、しかもたくさんの列があるなら、この文法を使うのは面倒です.
第一に、selectを一時変数に置くには、保存しにくいものがたくさんあります.第二に、変数を付与します.
列が多くなるのが面倒なので、Insertのように、Select文全体の結果を挿入してもらえませんか?次のようになります.
1
2
3
INSERT INTO table1
(c1, c2, c3)
(SELECT v1, v2, v3 FROM table2)

答えはいいですが、具体的な文法は以下の通りです.
1
2
3
4
5
6
UPDATE table1 alias
SET (column_name,column_name ) = (
SELECT (column_name, column_name)
FROM table2
WHERE column_name = alias.column_name)
WHERE column_name = VALUE

次に、2つのテーブルa,bが、bのmemoフィールド値をaテーブルの対応idのname値テーブルaに等しくしたい例を示す.
1
2
3
4
id    name 
1       
2       
3      

表b:
1
2
3
4
id    ClientName   
1 
2 
3

(MS SQL Server)文:
1
UPDATE b   SET   ClientName    = a.name    FROM a,b    WHERE a.id = b.id

(Oralce)文:
1
UPDATE b   SET   (ClientName)    =   (SELECT name FROM a WHERE b.id = a.id)

update set from文フォーマットwhereとsetが1つのテーブルを関連付けてクエリーする必要がある場合、update全体が実行される場合、関連付けられたテーブルを2回スキャンする必要があります.明らかに効率が低いです.
この場合、SybaseとSQL SERVERの解決策はUPDATE...SET...FROM...WHERE...の構文を使用し、実際にはソーステーブルから更新データを取得することです.
SQLでは、テーブル接続(left join、right join、inner joinなど)がselect文によく使用されます.実はSQL構文では、これらの接続もupdateとdelete文に使用できます.これらの文でjoinを使用すると、仕事の半分以上の効果が得られます.
1
2
UPDATE T_OrderForm SET T_OrderForm.SellerID =B.L_TUserID
FROM T_OrderForm A LEFT JOIN T_ProductInfo   B ON B.L_ID=A.ProductID

2つのテーブルを同期するためのデータ!
OralceとDB 2でサポートされている構文:
1
UPDATE A SET (A1, A2, A3) = (SELECT B1, B2, B3 FROM B WHERE A.ID = B.ID)

MS SQL Serverでは、このような構文はサポートされていません.
1
UPDATE A  SET A1 = B1, A2 = B2, A3 = B3  FROM A LEFT JOIN B ON A.ID = B.ID

個人的にはMS SQL ServerのUpdate文法機能がもっと強いと思います.MS SQL SERVERの書き方:
1
UPDATE A SET A1 = B1, A2 = B2, A3 = B3 FROM A, B WHERE A.ID = B.ID

OracleとDB 2では、次のように書き方が面倒です.
1
2
UPDATE A SET (A1, A2, A3) = (SELECT B1, B2, B3 FROM B WHERE A.ID = B.ID)
WHERE ID IN (SELECT B.ID FROM B WHERE A.ID = B.ID)

オリジナルの文章は転載するなら明記して、転載して:www.aimks.com