0

2つのテーブルAとB(同じスキーマ)があり、AのすべてのエントリをBに挿入してマージしたいと思います。テーブルBにすでにAのキーに関連付けられたデータがある場合は、それらのデータをサイレントに削除します。

問題は、テーブルBに3つの列で構成される一意のキーインデックスがあるため、「」とだけ言うことはできないということWHERE A.key <> B.keyです。

次の行に沿ってSQLステートメントを作成できないようです。

INSERT INTO B 
VALUES ((SELECT * FROM A WHERE ... NOT IN ...))

INSERT対応する3列のキーがBにまだ存在しない、AからBへの行への方法はありますか?

4

2 に答える 2

2
INSERT INTO B 
(Col1, Col2, Col3, ColN)
SELECT
A.Col1, A.Col2, A.Col3, COlN
FROM A
LEFT JOIN B
ON A.COL1 = B.Col1
AND A.COL2 = B.Col2
AND A.COL3 = B.Col3
WHERE B.Col1 IS NULL

基本的に、2つのテーブルを左結合で結合し、BがnullであるAからすべてを挿入します(3つのキー列の結合に対応する値がBテーブルにありません)

于 2012-11-22T11:24:41.573 に答える
1

NOT EXISTS代わりに使用できますNOT IN

INSERT B
SELECT  *
FROM    A
WHERE   NOT EXISTS
        (   SELECT  1
            FROM    B
            WHERE   A.Key1 = B.Key1
            AND     A.Key2 = B.Key2
        )

これによると MySQLは最適化LEFT JOIN/IS NULL存在しないよりも優れていますが:

INSERT B
SELECT  A.*
        LEFT JOIN B
            ON A.Key1 = B.Key1
            AND A.Key2 = B.Key2
WHERE   B.Key1 IS NULL
于 2012-11-22T11:27:37.023 に答える