3

これが私が欲しいものです:tableAからtableBに行をコピーしますが、すでにtableBにある行はコピーしません。PKまたはIDはありません。各フィールドをチェックしたいだけで、すべて同じフィールドに一致する行がある場合は挿入しません。私はINSERTとMERGEの両方で試しました:

 --try with INSERT
 INSERT TableB(col1,col2,col3,col4,col5,col6, etc.)
 SELECT (col1,col2,col3,col4,col5,col6, etc.)  
 FROM tableA as src
 WHERE NOT EXISTS (SELECT 1 FROM TableB as T
            WHERE               
            T.col1 = src.col1 AND
            T.col2 = src.col2 AND
            T.col3 = src.col3 AND
            T.col4 = src.col4 AND
            T.col5 = src.col5 AND
            T.col6 = src.col6, etc.)

私もMERGEで試しました:

  MERGE INTO tableA src
  USING tableB T
  ON (
            T.col1 = src.col1 AND
            T.col2 = src.col2 AND
            T.col3 = src.col3 AND
            T.col4 = src.col4 AND
            T.col5 = src.col5 AND
            T.col6 = src.col6, etc.)
  WHEN NOT MATCHED THEN
  INSERT (col1,col2,col3,col4,col5,col6, etc.)
  VALUES (col1,col2,col3,col4,col5,col6, etc.);

どちらもまったく同じことを行います。挿入(またはマージ)を実行すると、最初はすべての行がインポートされます。これは問題ありませんが、2回目の試行(0行を挿入/マージする必要があります)で60%が挿入/マージされます。行の。

この問題は、他の投稿で見たようなPKがないためだと思います。すべてのフィールドで一致させたいのですが、それは可能ですか?私は何かが足りないのですか?

アドバイス/指示をありがとう!

4

4 に答える 4

6

EXCEPTを使用できます

INSERT INTO table1
SELECT * from table2
EXCEPT 
SELECT * from table1;

ここでフィドルを見てください

于 2012-08-30T19:26:51.520 に答える
2

次のように、selectステートメントでaを使用してLEFT OUTER JOIN、すべての列があるレコードを検索できますNULL

 INSERT INTO tableB (col1,col2,col3,col4,col5,col6, etc.)
 SELECT (A.col1, A.col2, A.col3, A.col4, A.col5, A.col6, etc.)  
 FROM tableA as A
 LEFT OUTER JOIN tableB AS B ON A.col1 = B.col1 AND A.col2 = B.col2 AND 
     A.col3 = B.col3 ... /* all the way to B.col99 or whatever */
 WHERE B.col1 IS NULL AND B.col2 IS NULL AND B.col3 IS NULL ... 
    /* all the way to B.col99 or whatever your last column is */
于 2012-08-30T19:00:37.717 に答える
2

私の推測では、問題はNULLです。次のようにクエリを試してください。

INSERT TableB(col1,col2,col3,col4,col5,col6, etc.)
SELECT (col1,col2,col3,col4,col5,col6, etc.)  
FROM tableA as src
WHERE NOT EXISTS (SELECT 1 FROM TableB as T
                  WHERE (T.col1 = src.col1 or t.col1 is null and src.col1 is null) AND
                        (T.col2 = src.col2 or t.col2 is null and src.col2 is null) AND
                        . . .
于 2012-08-30T19:21:13.277 に答える
0

あなたの問題は、NULL値に関係している可能性があります。次のスクリプトは、いくつかの列がNULLである既存の行がある場合、それらが一致することを確認します。

--Create the sample source table.
--Notice that the columns allow NULL values...
CREATE TABLE #T1
(
  Col1 nvarchar(10) NULL,
  Col2 nvarchar(10) NULL,
  Col3 nvarchar(10) NULL
)

--Create the sample destination table.
CREATE TABLE #T2
(
  Col1 nvarchar(10) NULL,
  Col2 nvarchar(10) NULL,
  Col3 nvarchar(10) NULL
)
GO
--Populate the source table with some initial rows
--Notice that some column values are NULL
INSERT INTO #T1 (Col1,Col2,Col3) 
VALUES ('A','B',NULL),
        ('D','E','F'),    
        ('G',NULL,'I');
GO
--Verify the data in the tables 
--Table #T1 should have data in it
SELECT * FROM #T1;
--Table #T2 should be empty
SELECT * FROM #T2;
GO
--Copy the rows from #T1 to #T2
--where there are no matching rows.
INSERT INTO #T2(Col1,Col2,Col3)
SELECT 
  T1.Col1,T1.Col2,T1.Col3 
FROM #T1 AS T1
LEFT OUTER JOIN #T2 AS T2
ON  IsNull(T1.Col1,'') = IsNull(T2.Col1,'')
AND IsNull(T1.Col2,'') = IsNull(T2.Col2,'')
AND IsNull(T1.Col3,'') = IsNull(T2.Col3,'')
WHERE T2.Col1 IS NULL AND T2.Col2 IS NULL AND T2.Col3 IS NULL
GO
--Verify the data in the tables.  They should be the same now.
SELECT * FROM #T1;
SELECT * FROM #T2;
GO
--Add a some new rows to #T1
INSERT INTO #T1 (Col1,Col2,Col3) 
VALUES ('J','K','L'),
       ('M',NULL,'O'),
       ('P','Q','R'),
       ('A','B','C'); --THIS LAST ROW DOES NOT MATCH THE EXISTING A,B,NULL ROW AND WILL BE INSERTED ON MERGE
GO
--Merge the tables, and yes you could use MERGE where the ON clause handled NULLs
INSERT INTO #T2(Col1,Col2,Col3)
SELECT 
  T1.Col1,T1.Col2,T1.Col3 
FROM #T1 AS T1
LEFT OUTER JOIN #T2 AS T2
ON  IsNull(T1.Col1,'') = IsNull(T2.Col1,'')
AND IsNull(T1.Col2,'') = IsNull(T2.Col2,'')
AND IsNull(T1.Col3,'') = IsNull(T2.Col3,'')
WHERE T2.Col1 IS NULL AND T2.Col2 IS NULL AND T2.Col3 IS NULL
GO
--Verify the new data is in both tables.
SELECT * FROM #T1;
SELECT * FROM #T2;
GO
--Cleanup
DROP TABLE #T1;
DROP TABLE #T2;
于 2012-08-30T19:22:11.133 に答える