SQL объединить и объединить несколько таблиц с несколькими общими столбцами - PullRequest
1 голос
/ 24 марта 2020

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

IF OBJECT_ID(N'dbo.table1', N'U') IS NOT NULL
    DROP TABLE dbo.table1;

CREATE TABLE table1 (
    id      INT,
    comp    INT,
    item1   INT
);

INSERT INTO dbo.table1 
VALUES
    (1, 1, 1),
    (2, 2, 2),
    (3, 1, 3); -- note: ID 3 not in table 2

-- -------------------------------------------------------------
IF OBJECT_ID(N'dbo.table2', N'U') IS NOT NULL
    DROP TABLE dbo.table2;

CREATE TABLE table2 (
    id      INT,
    comp    INT,
    item2   INT
);

INSERT INTO dbo.table2 
VALUES
    (1, 1, 1),
    (2, 2, 2),
    (4, 2, 4); -- note: ID 4 not in table 1


SELECT id, comp, item1, CAST(NULL AS INT) AS item2
FROM dbo.table1
UNION
SELECT id, comp, CAST(NULL AS INT) AS item1, item2
FROM dbo.table2;

Что я получу:

id   comp   item1   item2
1    1      NULL    1
1    1      1       NULL
2    2      NULL    2
2    2      2       NULL
3    1      3       NULL
4    2      NULL    4

Что я ожидал (надеялся for):

id   comp   item1   item2
1    1      1       1
2    2      2       2
3    1      3       NULL
4    2      NULL    4

Таким образом, очевидно, что где-то должно быть соединение по идентификатору, но как мне объединить другие столбцы. Существует около 9 разных таблиц для объединения / объединения.

1 Ответ

2 голосов
/ 24 марта 2020

Вы можете group by id, comp и использовать max () для каждого из столбцов itemx:

SELECT t.id, t.comp, max(t.item1) item1, max(t.item2) item2
FROM (
  SELECT id, comp, item1, CAST(NULL AS INT) AS item2
  FROM dbo.table1
  UNION
  SELECT id, comp, CAST(NULL AS INT) AS item1, item2
  FROM dbo.table2
) t
GROUP BY t.id, t.comp

Вы также можете использовать UNION ALL вместо UNION. Смотрите демо . Результаты:

> id | comp | item1 | item2
> -: | ---: | ----: | ----:
>  1 |    1 |     1 |     1
>  2 |    2 |     2 |     2
>  3 |    1 |     3 |  null
>  4 |    2 |  null |     4
...