2017-10-05 8 views
-1

テーブルに複数の行を挿入する必要があります。私は別のテーブルから行を選択し、それらを目的のテーブルに挿入することでこれを行います。SQL Server:複数存在しない場合

問題は、挿入する必要がある行の1つまたは2つが既に存在する可能性があることです。この例のように多くの行を挿入している挿入物でIF NOT EXISTSを実行するにはどうすればよいですか?

BEGIN TRAN 
    INSERT INTO [main].[dbo].[product_usa] 
     SELECT * 
     FROM [main].[dbo].[product_mxo] 
     WHERE tag_key IN ('15652', '16161', '11431', '16214', '16215', '16216', 
          '16213', '16217', '16218', '16222') 
      AND edition_key = '1' 
      AND product_key = '1' 
-- COMMIT 
-- ROLLBACK 

答えて

0

tag_keyproduct_usaproduct_mxoの両方でのPKであれば、単にtag_keyを検証するためにexistsを追加必要がまだありません。

INSERT INTO [main].[dbo].[product_usa] 
    SELECT * 
    FROM [main].[dbo].[product_mxo] mxo 
    WHERE tag_key IN 
     ('15652', '16161', '11431', 
     '16214', '16215', '16216', 
     '16213', '16217', '16218', 
     '16222') 
    AND edition_key = '1' 
    AND product_key = '1' 
    AND NOT EXISTS (SELECT 1 
        FROM [main].[dbo].[product_usa] usa 
        WHERE us.tag_key = mxo.tag_key) 
+0

0行が影響を受けます。私はこれをどのように拡張するのかは分かりませんが、影響を受けるはずの行があります。 – John

+0

クエリが正常に表示されます。 'SELECT * FROM [main]。[dbo]。[product_usa] usa WHERE tag_key IN (' 15652 '、' 16161 '、' 11431 '、 ' 16214 '、' 16215 '、' 16216 '、 ' 16213 '、' 16217 '、' 16218 '、 ' 16222 ')'結果はどうですか?次に 'mxo'でも同じことをしてください –

+0

selectは両方のテーブルでうまく動作します – John

0

このようにEXISTSを追加できます。

BEGIN TRAN 
INSERT INTO [main].[dbo].[product_usa] 
    SELECT * 
    FROM [main].[dbo].[product_mxo] 
    WHERE tag_key IN 
    (
     '15652', 
     '16161', 
     '11431', 
     '16214', 
     '16215', 
     '16216', 
     '16213', 
     '16217', 
     '16218', 
     '16222' 
    ) AND edition_key = '1' AND product_key = '1' 
    AND NOT EXISTS(SELECT * FROM [main].[dbo].[product_usa] WHERE /* Column Comparison */) 
0

仮定tag_keyは、あなたがこのような何かを行うことが主キーまたはユニーク・キーである:

INSERT INTO [main].[dbo].[product_usa] 
    SELECT * 
    FROM [main].[dbo].[product_mxo] t 
    WHERE tag_key IN 
    (
     '15652', 
     '16161', 
     '11431', 
     '16214', 
     '16215', 
     '16216', 
     '16213', 
     '16217', 
     '16218', 
     '16222' 
    ) AND edition_key = '1' AND product_key = '1' 
    AND NOT EXISTS (SELECT 1 FROM [main].[dbo].[product_usa] x WHERE t.tag_key = x.tag_key) 

あなたは自分の他の場所の条件を取り除く存在しないすべてのレコードをしたい場合は

INSERT INTO [main].[dbo].[product_usa] 
    SELECT * 
    FROM [main].[dbo].[product_mxo] t 
    WHERE 
     NOT EXISTS (SELECT 1 FROM [main].[dbo].[product_usa] x WHERE t.tag_key = x.tag_key) 
+0

@元のソリューションと同じですが、0行が影響を受けます。 – John

+0

@Johnはい彼と私は同時に答えましたが、まったく同じ答えではありません。彼の答えのコメントを読んで、おそらく私の答えの第二の部分を考慮する必要があります。しかし、あなたが望むものを説明する必要があります。たとえば、「product_mxoからproduct_usaにすべての行を挿入しようとしています」という主キーが存在しないなど、tag_keyまたは別の列があります。または、テーブルを同期しようとしている、またはxyz基準を満たし、存在しないすべての製品を挿入しようとしています....結果を得ることができない場合は、または間違っている場合 – Matt

0

tag_keyのターゲットテーブルで左外部結合を行い、ヌルをチェックします。

INSERT INTO [main].[dbo].[product_usa] 
SELECT m.* 
FROM [main].[dbo].[product_mxo] m 
LEFT OUTER JOIN [main].[dbo].[product_usa] u 
ON u.tag_key = m.tag_key 
WHERE m.tag_key IN 
(
    '15652', 
    '16161', 
    '11431', 
    '16214', 
    '16215', 
    '16216', 
    '16213', 
    '16217', 
    '16218', 
    '16222' 
) AND m.edition_key = '1' AND m.product_key = '1' AND u.tag_key IS NULL 
+0

申し訳ありません...あなたは存在しないことについて質問していました。私の答えは、あなたが記述した問題を解決するが、あなたが尋ねたツールは使用しない。私の間違い... – SQLCliff

関連する問題