1

次のようなデータを含む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;
4

3 に答える 3