Объединить две таблицы в SQL, с одним общим столбцом - PullRequest
2 голосов
/ 23 января 2020

Я пытаюсь объединить таблицы в MS SQL, как в примере ниже. Моя ситуация похожа на этот вопрос. T- SQL объединение двух таблиц с общими и необычными столбцами

Я попытался использовать следующий запрос:

select coalesce(t1.a, t2.a), t1.b, t1.c, t2.d, t2.k
from Table1_test t1
full outer join Table2_test t2 on t2.a = t1.a

Но это приводит к тому, что строки, имеющие одинаковое значение в столбце a, объединяются в одной строке

a   b   c      d    k
1   2   3      5    6
7   8   9     null  null
4 null  null   6    7
9 null  null   0    2

Table1_test:

a b c
1 2 3
7 8 9 

Table2_test:

a d k
4 6 7
1 0 2

Объединенная таблица Я хочу :

a   b   c      d    k
1   2   3     null  null
7   8   9     null  null
4 null  null   6    7
1 null  null   0    2

1 Ответ

3 голосов
/ 23 января 2020

Вы можете использовать следующее с помощью UNION ALL:

SELECT a, b, c, NULL AS d, NULL AS k FROM table1_test
UNION ALL
SELECT a, NULL, NULL, d, k FROM table2_test

Вы также можете использовать FULL OUTER JOIN с условием ложного совпадения (1 = 2):

SELECT COALESCE(t1.a, t2.a) AS a, t1.b, t1.c, t2.d, t2.k
FROM Table1_test t1 FULL OUTER JOIN Table2_test t2 ON 1 = 2

Вы также можете сгенерировать приведенный выше запрос SQL (если столбцов много или вы не хотите самостоятельно выбирать общие / необычные имена столбцов):

DECLARE @sql VARCHAR(MAX) = 'SELECT ' + (
  SELECT STUFF((SELECT ',' + + col FROM (
    SELECT CASE WHEN i1.t IS NOT NULL AND i2.t IS NOT NULL THEN 'COALESCE(' + i1.t + '.' + i1.COLUMN_NAME + ', ' + i2.t + '.' + i2.COLUMN_NAME + ') AS ' + i1.COLUMN_NAME ELSE COALESCE(i1.COLUMN_NAME, i2.COLUMN_NAME) END AS col, COALESCE(i1.COLUMN_NAME, i2.COLUMN_NAME) cname FROM (
    SELECT 't1' AS t, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Table1_test'
    ) i1 FULL OUTER JOIN (
    SELECT 't2' AS t, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Table2_test'
    ) i2 ON i1.COLUMN_NAME = i2.COLUMN_NAME

  ) cols ORDER BY cname FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
) + ' FROM Table1_test t1 FULL OUTER JOIN Table2_test t2 ON 1 = 2'

EXECUTE(@sql)

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

демо на dbfiddle.uk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...