Левый стол соединения с эксклюзивным ИЛИ - PullRequest
0 голосов
/ 09 мая 2018

Есть ли способ объединить 2 таблицы вместе на одном и только одном из возможных условий? Присоединение при условии «a» или «b» может дублировать строки, но я хочу присоединиться только один раз. Я нашел потенциальное решение, но мне интересно, есть ли более удобный способ сделать это.

Например:

SELECT *
FROM TableA a
LEFT JOIN TableB b
    ON a.col1 = b.col1
    OR (a.col1 != b.col1 AND a.col2 = b.col2)

Это объединит таблицы на col1 ИЛИ col2, НО НЕ ОБА. Есть ли более чистый способ сделать это?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Ваш метод работает. Если вам нужен только один (или несколько) столбцов из b, я бы предложил:

SELECT a.*, COALESCE(b.col3, b2.col3)
FROM TableA a LEFT JOIN
     TableB b
     ON a.col1 = b.col1 LEFT JOIN
     TableB b2
     ON a.col1 <> b2.col1 AND a.col2 = b2.col2;

Удаление OR из условий JOIN позволяет оптимизатору сгенерировать лучший план выполнения.

0 голосов
/ 09 мая 2018

Не более эффективно, но я думаю, что более ясно

SELECT *
FROM TableA a
LEFT JOIN TableB b
  ON     (a.col1 = b.col1 or  a.col2 = b.col2)
 AND NOT (a.col1 = b.col1 and a.col2 = b.col2)
...