2

同じスキーマを持つ2つのテーブル、テーブルAとテーブルBがあります。

| Table [A]        | Table [B]   
| id    value      | id    value
| 1     15         | 1     19
| 2     18         | 3     28
| 5     22         | 4     39

私がしたいのは:

insert into a select * from b where [b.id not exists in a]

質問:これの構文は何ですか?特に、括弧内の部分は何ですか?

4

3 に答える 3

6

INSERT INTO..SELECTステートメントとを使用しLEFT JOINます。

INSERT INTO tableB (id, Value)
SELECT  a.id, a.value
FROM    tableA a
        LEFT JOIN tableB b 
            ON a.ID = b.ID
WHERE   b.id IS NULL
于 2012-12-17T15:26:02.790 に答える
4

そのようです:

INSERT INTO a(id, value)
SELECT * 
FROM b 
WHERE b.id NOT IN (SELECT id from a)
  AND b.id IS NOT NULL ; 

注:NULL述語を使用する場合は、値に注意する必要がありますIN。それ以外の場合は、NOT EXISTS述語を使用します。より安全であるか、LEFT JOIN@kuyaJohnが提案したようなものを使用します。

于 2012-12-17T15:25:28.593 に答える
1

SQL 2008以降を使用している場合は、マージを使用してこれを実現することもできます。これにより、ターゲットテーブルに行が存在しない場合だけでなく、IDが存在する場合の処理​​条件も簡単に追加できるという利点があります。一致しますが、値が異なります(更新する可能性があります)、またはソースに存在しない行がターゲットテーブルにある場合(削除する可能性があります):

MERGE TableB AS TARGET
USING TableA AS SOURCE
ON (target.ID = source.ID) 

WHEN NOT MATCHED BY TARGET
    THEN INSERT (ID, Value) VALUES (source.ID, source.Value);

マージの使用の詳細については、次を参照してください。

MERGEを使用したデータの挿入、更新、および削除

于 2012-12-17T15:50:37.673 に答える