0

要件は、テーブル B からテーブル A に行をコピーすることです。まだ存在しない ID を持つ行のみをコピーする必要があります。

INSERT INTO A(id, x, y)
SELECT id, x, y
FROM B b
WHERE b.id IS NOT IN (SELECT id FROM A WHERE x='t');
                                       ^^^^^^^^^^^

今、説明パスを比較するために外部結合でこれを書き込もうとしていましたが、これを書くことはできません(少なくとも効率的に)。

^ で強調表示された sql がこれをややこしくしていることに注意してください。

4

4 に答える 4

4

試す

INSERT INTO A(id, x, y)
SELECT id, x, y
FROM TableB b
  Left Join TableA a
     On a.Id = b.Id
        And a.x = 't'
Where a.Id Is Null

しかし、サブクエリ表現の方が、あなたがしていることをより明確に表現していると思うので、私はサブクエリ表現を好みます。

于 2009-12-07T21:53:26.280 に答える
3

持っているものに満足しないのはなぜですか。説明計画を確認すると、オプティマイザーがそれが最も効率的な方法であると判断した場合 (そうなる可能性が最も高い)、アンチ結合が実行されることが示されていることを約束します。

これを読んでいるすべての人へ: SQL は実際に実行されるものではありません。SQL は、何をするかではなく、何をしたいかをデータベースに伝える方法です。すべての適切なデータベースは、NOT EXISTS と NOT IN を等しいものとして扱い (つまり、null 値がない場合)、アンチ結合を実行できます。ただし、外部結合と IS NULL 条件を使用したトリックは、SQL Server では機能しません (SQL Server は、それをアンチ結合に変換するほど巧妙ではありません)。

于 2009-12-07T21:57:58.227 に答える
0

クエリは、外部結合を使用したクエリよりも優れたパフォーマンスを発揮します。

次のクエリでうまくいくと思います。

INSERT INTO A(id, x, y)
SELECT id, x, y
FROM B b
LEFT JOIN A a
ON b.id = a.id AND NOT a.x='t'
于 2009-12-07T21:55:20.320 に答える
0
INSERT INTO A (id, x, y)
SELECT
    B.id, B.x, B.y
FROM
    B
WHERE
    NOT EXISTS (SELECT * FROM A WHERE B.id = A.id AND A.x = 't')
于 2011-11-03T22:11:43.967 に答える