0

これが私の障害です。

2つのテーブルがあります。テーブルAにはテーブルBよりも多くの行が含まれています。結果をマージする必要があります。テーブルAにテーブルBの行が含まれていない場合は、新しいセットに挿入します。ただし、テーブルAの行にテーブルBと同じ主キーを持つ行が含まれている場合、新しいセットはテーブルBの行を取得します。

これはカーソルで行うのが最善でしょうか、それともこれを行うためのより簡単な方法がありますか?2,000万行あり、SQLを初めて使用する場合でも、カーソルが高価であると聞いているので、質問します。

4

3 に答える 3

1

あなたの言い回しは少し曖昧です。TableB のすべてを取得し、B に一致する主キーがない TableA の行を取得する必要があるようです。次のクエリは、この問題を解決します。

select *
from tableB union all
select *
from tableA
where tableA.pk not in (select pk from tableB)
于 2013-02-19T17:39:07.527 に答える
0

OUTER JOINは、必要なことを実行し、カーソルよりも効率的である必要があります。このクエリを試してください

--first get the rows that match between TableA and TableB
INSERT INTO [new set]
SELECT TableB.* --or columns of your choice
FROM TableA LEFT JOIN TableB ON [matching key criteria]
WHERE TableB.[joining column/PK] IS NOT NULL

--then get the rows from TableA that don't have a match
INSERT INTO [new set]
SELECT TableA.* --you didn't say what was inserted if there was no matching row 
FROM TableA LEFT JOIN TableB ON [matching key criteria]
WHERE TableB.[joining column/PK] IS NULL
于 2013-02-19T17:47:52.257 に答える
0

ええ、カーソルは高価です。

SQL の新しいバージョンには、これを一発で実行できるMERGEコマンドがありますが、非常に面倒です。2 つに分けて実行することをお勧めします - 最初に:

UPDATE A SET
    field1 = B.field1
   ,field2 = B.field2
   , etc
FROM A JOIN B on B.id = A.id

それで:

INSERT A SELECT * FROM B --enumerate fields if different
WHERE B.id not in (select id FROM A)
于 2013-02-19T17:38:41.063 に答える