SQL-соединение между двумя таблицами с условием ИЛИ - PullRequest
0 голосов
/ 05 ноября 2019

Я просто пытаюсь понять концепцию объединения двух таблиц с условием ИЛИ. Мое требование: мне нужно объединить 2 таблицы Table1 [colA, colB] и Table2 [colX, colY] в столбцах Table1.colA = Table2.colB, но если colA равно NULL, условие должно быть Table1.colB = Table2.colY.

Нужно ли присоединиться к ним отдельно, а затем объединиться? Или я могу сделать это за одно соединение? Обратите внимание, что у меня есть миллионы записей в обеих таблицах, и это левое соединение, и таблицы находятся в HIVE. У меня нет воспроизводимого примера, я просто пытаюсь понять концепцию.

Ответы [ 2 ]

2 голосов
/ 05 ноября 2019

Хотя я не знаком с HiveQL, на SQL-сервере это можно сделать следующим образом:

SELECT *
FROM   table1 t1
       JOIN table2 t2
         ON COALESCE(t1.cola, t1.colb) = CASE
                                           WHEN t1.cola IS NULL THEN t2.coly
                                           ELSE t2.colx
                                         END  

Логика должна быть достаточно читабельной.

0 голосов
/ 05 ноября 2019

Переведите ваши условия напрямую:

SELECT *
FROM table1 t1 JOIN
     table2 t2
     ON (t1.cola = t2.colb) or
        (t1.cola is null and t1.colb = t2.coly)

Обычно or является убийцей производительности в join с. Этот мир часто выражается двумя отдельными left join с:

SELECT . . . , COALESCE(t2a.col, t2b.col) as col
FROM table1 t1 LEFT JOIN
     table2 t2a
     ON (t1.cola = t2.colb) LEFT JOIN
     table2 t2b
     ON t1.cola is null and t1.colb = t2.coly;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...