Как объединить две таблицы с неодинаковым количеством строк для одного значения первичного ключа - PullRequest
0 голосов
/ 29 апреля 2019

Я хочу объединить две одинаковые таблицы с разными данными для одного и того же значения первичного ключа.

Я выполняю полное объединение двух таблиц, так как хочу узнать, какая информация изменилась для одного и того же идентификатора за два месяца. Я также пытался использовать группирование по предложениям, но это не сработало.

Select 
    a.ID, a.Value1,
    b.Value
from 
    TableA a
full join 
    TableB b on a.ID = b.ID 

Входные данные:

Table A         Table B

ID  Value       ID  Value
---------       ----------
1   A           1   A
1   B           1   B
2   A           1   C

Желаемый вывод:

ID VALUE1  Value2
-----------------
1   A       A
1   B       B
1   Null    C

Токовый (неправильный) выход:

ID VALUE1  Value2
-----------------
1   A       A
1   A       B
1   A       C
1   B       A
1   B       B
1   B       C

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Я подозреваю, что ВСЕ комбинации желательны, поэтому ПОЛНОЕ Объединение лучше.

Select Case When a.ID IS Null Then b.ID Else a.ID End as ID,
       a.Value,
       b.Value
from UnequalRowsTableA a
     full join UnequalRowsTableB b on a.ID=b.ID and a.Value = b.Value

Результаты

ID  Value   Value
1   A         A         
1   B         B         
2   A         NULL
1   NULL      C     
0 голосов
/ 29 апреля 2019

Вы можете использовать TableB в FROM, затем TableA в LEFT JOIN и в вашем предложении ON добавить совпадение Value, чтобы достичь ожидаемого результата:

SELECT B.ID,
       A.Value AS Value1,
       B.Value AS Value2
FROM TableB B
LEFT JOIN TableA A ON A.ID = B.ID AND A.Value = B.Value;

Демо с примерами данных:

DECLARE @TableA TABLE (ID INT, [Value] VARCHAR (1));

INSERT INTO @TableA (ID, [Value]) VALUES
(1, 'A'), (1, 'B'), (2, 'A');

DECLARE @TableB TABLE (ID INT, [Value] VARCHAR (1));

INSERT INTO @TableB (ID, [Value]) VALUES
(1, 'A'), (1, 'B'), (1, 'C');

SELECT B.ID,
       A.[Value] AS Value1,
       B.[Value] AS Value2
FROM @TableB B
LEFT JOIN @TableA A ON A.ID = B.ID AND A.[Value] = B.[Value];

Вывод:

ID  Value1  Value2
----------------------
1   A       A
1   B       B
1   NULL    C
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...