Учитывая следующие данные / схему:
DECLARE @t1 TABLE (
Id int NOT NULL
)
DECLARE @t2 TABLE (
Id INT NOT NULL,
Val1 CHAR(1) NOT NULL
)
DECLARE @t3 TABLE (
Id INT NOT NULL,
Val2 CHAR(1) NOT NULL
)
INSERT INTO @t1 VALUES (1)
INSERT INTO @t2 VALUES (1, 'A')
INSERT INTO @t2 VALUES (1, 'B')
INSERT INTO @t2 VALUES (1, 'C')
INSERT INTO @t3 VALUES (1, '9')
INSERT INTO @t3 VALUES (1, '8')
Я хотел бы видеть следующий набор результатов:
Id,Val1,Val2
1,'A','9'
1,'B','8'
1,'C',NULL
Теперь добавьте следующее:
INSERT INTO @t3 VALUES (1, '7')
INSERT INTO @t3 VALUES (1, '6')
И я хотел бы видеть это:
Id,Val1,Val2
1,'A','9'
1,'B','8'
1,'C','7'
1,NULL,'6'
Вот что я придумал:
DECLARE @t4 TABLE(
Id INT NOT NULL,
RowNumber INT NOT NULL,
Val1 CHAR(1) NULL,
Val2 CHAR(1) NULL
)
INSERT INTO @t4 (Id, RowNumber, Val1)
SELECT Id, ROW_NUMBER() OVER(ORDER BY Id), Val1
FROM @t2
MERGE @t4 T
USING(SELECT Id, ROW_NUMBER() OVER(ORDER BY Id) RowNumber, Val2 FROM @t3) S
ON (T.Id = S.Id AND T.RowNumber = S.RowNumber)
WHEN MATCHED THEN
UPDATE SET T.Val2 = S.Val2
WHEN NOT MATCHED THEN
INSERT (Id, RowNumber, Val2) VALUES (Id, RowNumber, Val2);
SELECT Id, Val1, Val2 FROM @t4
Но я хотел бы знать, может ли кто-нибудь придумать что-нибудь попроще, используя SELECT с JOIN вместо MERGE