Есть ли команда, которая объединяет функции UNION и JOIN в SQL? - PullRequest
0 голосов
/ 17 января 2019

Я имею в виду, например, что у меня есть запрос, который объединяет результаты из двух таблиц A и B; где A имеет несколько столбцов, идентичных B, но несколько разных столбцов, и то же самое относится к B. Есть ли команда, которая может объединить данные в одинаковых столбцах (UNION), но объединить различные столбцы в конечном результате (JOIN), или мне придется сделать это утомительно?

Предпочел бы ответ с учетом SQLite или Postgresql, но любой другой в порядке.


EDIT:

Скажем, таблица A имеет следующие столбцы:

ID    Source    Destination    Timestamp

И таблица B имеет следующие столбцы:

ID    Source    Destination    Group    Read

Я бы хотел, чтобы таблица C (запрос) имела следующие столбцы со взаимоисключающими столбцами, имеющими значения NULL в обоих случаях:

ID    Source    Destination    Timestamp    Group    Read

1 Ответ

0 голосов
/ 17 января 2019

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

  • Таблица X с колонками A, B, C, D, E
  • Таблица Y с колонками A, B, C, F
SELECT A, B, C, D, E, '' AS F
FROM X
UNION ALL
SELECT A, B, C, '' AS D, NULL AS E, F
FROM Y

Используйте UNION (без ALL), если вы хотите удалить дубликаты. Могут быть только дубликаты, если дополнительные столбцы соответствуют значениям по умолчанию, используемым для другой таблицы.


Другой подход заключается в объединении соответствующих столбцов для устранения дубликатов в этих столбцах

SELECT
    COALESCE(X.A, Y.A) AS A,
    COALESCE(X.B, Y.B) AS B,
    COALESCE(X.C, Y.C) AS C,
    X.D,
    X.E,
    Y.F
FROM
    X
    FULL OUTER JOIN Y
        ON X.A = Y.A AND
           X.B = Y.B AND
           X.C = Y.C

Это, вероятно, соответствует вашей идее объединить UNION и JOIN. В отличие от подхода UNION, это объединяет строки с одинаковыми A, B и C.

Обратите внимание, что вы должны использовать FULL OUTER JOIN , чтобы включить результаты обеих таблиц, даже если соответствующая запись отсутствует в другой таблице. Не все диалекты SQL имеют внешнее соединение.

Функция coalesce имеет разные названия на разных диалектах.

Вы также можете столкнуться с проблемой JOIN пропущенных значений NULL при объединении значений NULL.

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