次のようなテーブル構造があるとします。
CREATE TABLE Table1 (
Col1 INT NOT NULL,
Col2 INT NOT NULL,
Col3 INT NOT NULL,
Col4 INT NOT NULL,
Col5 INT NOT NULL,
Col6 INT NOT NULL,
PRIMARY KEY (Col1, Col2, Col3, Col4)
);
CREATE TABLE Table2 (
Col1 INT NOT NULL,
Col2 INT NOT NULL,
Col3 INT NOT NULL,
Col4 INT NOT NULL,
Col5 INT NOT NULL,
Col6 INT NOT NULL,
PRIMARY KEY (Col1, Col2, Col3, Col4)
);
そして、次のようなサンプル データがあることを確認します。
INSERT INTO Table1 (
Col1, Col2, Col3, Col4, Col5, Col6
)
VALUES
(1, 1, 1, 1, 25, 7),
(2, 2, 2, 2, 8, 9),
(3, 3, 3, 3, 25, 12);
INSERT INTO Table2 (
Col1, Col2, Col3, Col4, Col5, Col6
)
VALUES
(1, 1, 1, 1, 26, 8),
(2, 2, 2, 2, 9, 10),
(4, 4, 4, 4, 30, 3);
ANSI ソリューション
この問題は、 ANSI 更新構文を使用して解決できます。ANSI ソリューションは次のようになります。
UPDATE Table1
SET
Col5 = (
SELECT Col5
FROM Table2
WHERE
Table1.Col1 = Table2.Col1 AND
Table1.Col2 = Table2.Col2 AND
Table1.Col3 = Table2.Col3 AND
Table1.Col4 = Table2.Col4
),
Col6 = (
SELECT Col6
FROM Table2
WHERE
Table1.Col1 = Table2.Col1 AND
Table1.Col2 = Table2.Col2 AND
Table1.Col3 = Table2.Col3 AND
Table1.Col4 = Table2.Col4
)
WHERE EXISTS (
SELECT *
FROM Table2
WHERE
Table1.Col1 = Table2.Col1 AND
Table1.Col2 = Table2.Col2 AND
Table1.Col3 = Table2.Col3 AND
Table1.Col4 = Table2.Col4
);
最終的に、Table1 のデータは次のようになります。
Col1 Col2 Col3 Col4 Col5 Col6
1 1 1 1 26 8
2 2 2 2 9 10
3 3 3 3 25 12
テーブル 2 に対応する行があるため、行 1 と 2 が更新されています。テーブル 2 には対応する行がないため、行 3 は同じままです。
実際の例については、私のSQLFiddleを参照してください。SQLFiddle で SQLLite の SQL.js 実装を使用しました。
率直に言って、ANSI 更新構文は最悪です。複雑な更新を簡単にするために、すべての商用データベース エンジンが独自の拡張構文を備えているのは、非常に残念なことです。
SQLite に独自の拡張構文があるのか、それとも別のデータベース エンジンの構文を採用しているのかはわかりません。
SQL Server ソリューション
あなたは、SQL Server ソリューションを試したと言いました。
SQL Server 構文を使用すると、ソリューションは次のようになります。
UPDATE Table1
SET
Col5 = Table2.Col5,
Col6 = Table2.Col6
FROM Table1
INNER JOIN Table2 ON
Table1.Col1 = Table2.Col1 AND
Table1.Col2 = Table2.Col2 AND
Table1.Col3 = Table2.Col3 AND
Table1.Col4 = Table2.Col4;
残念ながら、SQLite はそれを理解していません。
SQLite exception: 1, near "FROM": syntax error
このソリューションは、おそらく SQL Server でのみ機能します。リンクされた質問に対する現在受け入れられている回答は、SQL Server、Oracle、MySQL、および ANSI の問題を解決するさまざまな方法を示しています。