次のようなデータを含む2つのデータテーブルがあります:-
| id | name | dob | | name | dob |
|-------|------|----------| |------|----------|
| 12345 | ABC | 20010301 | | ABC | 20010301 | - matching record
| 45678 | DEF | 20010425 | | XYZ | 20010301 | - unmatched record
2 つのテーブルを比較し、一致するテーブルと一致しないテーブルを作成し、元のテーブルの構造/データをそのままにしておくクエリを作成することは可能ですか?
Match Table Unmatched Table
| id | rank | | id | rank |
|-------|------| |-------|------|
| 12345 | 1 | | 45678 | NULL |
MERGE を試していましたが、1 つのソース テーブルを挿入/更新する必要があり、tsql に関して上限に達しました。また、30,000,000 行を超えるデータセットを扱う予定です。アドバイスや提案はありますか?
私がこれまで持っていたSQL(フィールドは一致しませんが、原則はあります)は次のとおりですか?
Create TABLE #Cohort ([ID] varchar(4),[match rank] int)
INSERT INTO #Cohort ([ID],[match rank]) VALUES('aaaa',NULL)
INSERT INTO #Cohort ([ID],[match rank]) VALUES('bbbb',NULL)
INSERT INTO #Cohort ([ID],[match rank]) VALUES('cccc',NULL)
INSERT INTO #Cohort ([ID],[match rank]) VALUES('dddd',NULL)
Create TABLE #link ([ID] varchar(4),[match rank] int)
INSERT INTO #link ([ID],[match rank]) VALUES(left(NEWID(),4),NULL)
INSERT INTO #link ([ID],[match rank]) VALUES(left(NEWID(),4),NULL)
INSERT INTO #link ([ID],[match rank]) VALUES('aaaa',NULL)
INSERT INTO #link ([ID],[match rank]) VALUES(left(NEWID(),4),NULL)
Create TABLE #Matches ([ID] varchar(4),[match rank] int)
Create TABLE #Unmatched ([ID] varchar(4),[match rank] int)
MERGE #Cohort tg
USING (SELECT distinct c.[ID], 1 as [match rank]
from #Cohort c
INNER JOIN #link as h on c.[ID]=h.[ID]) sc
ON (tg.[ID] = sc.[ID] )
WHEN NOT MATCHED BY TARGET
THEN INSERT([ID],[match rank]) VALUES(sc.[ID],sc.[match rank])
WHEN NOT MATCHED BY SOURCE
THEN DELETE
OUTPUT Deleted.* INTO #Unmatched;