Когда использовать правое соединение или полное внешнее соединение - PullRequest
1 голос
/ 21 марта 2020

Я работаю с DB / SQL почти ежедневно, и чем больше я работаю с sql, тем больше у меня мнение, что нет оснований использовать правильное соединение или полное внешнее соединение.

Предположим, у нас есть две таблицы: table1 и table2. Либо я хочу получить дополнительную информацию для строк в таблице1, чтобы я мог использовать внутреннее объединение в таблице2, и если я хочу сохранить исходные строки, если совпадений нет, я использую левое соединение:

left join enter image description here

Если мне нужно добавить дополнительную информацию в таблицу 2, я могу сделать то же самое и оставить таблицу 2 для соединения с таблицей. Поэтому я не вижу причины, по которой мне следует использовать правильное соединение. Есть ли какой-либо случай, когда вы не можете использовать левое соединение для правого соединения?

Я также подумал, понадобится ли мне когда-нибудь полное внешнее соединение. Почему вы объединяете две таблицы и сохраняете строки, которые не совпадают с обеими таблицами? Мы могли бы добиться этого, используя два левых соединения.

1 Ответ

1 голос
/ 21 марта 2020

Почему вы объединяете две таблицы и сохраняете строки, которые не совпадают с ОБА таблицами?

Полное объединение имеет случаи, когда это полезно. Одна из них сравнивает две таблицы для различий, таких как XOR между таблицами:

 SELECT * 
 FROM t1
 FULL JOIN t2
   ON t1.id = t2.id
 WHERE t1.id IS NULL 
    OR t2.id IS NULL;

Пример:

t1.id ... t2.id
1         NULL
NULL      2

Вы также можете достичь этого, используя два левых соединения.

Да, вы могли бы:

SELECT t1.*, t2.*
FROM t1
LEFT JOIN t2
  ON t1.id = t2.id
WHERE t2.id IS NULL
UNION ALL
SELECT t1.*, t2.*
FROM t2
LEFT JOIN t1
  ON t1.id = t2.id
WHERE t1.id IS NULL;

Некоторые SQL диалекты не поддерживают FULL OUTER JOIN, и мы подражаем так. Связанный: Как выполнить ПОЛНОЕ НАРУЖНОЕ СОЕДИНЕНИЕ в MySQL?


С другой стороны, RIGHT JOIN полезно, когда вам нужно объединить более двух таблиц:

SELECT *
FROM t1
JOIN t2 
  ...
RIGHT JOIN  t3
 ...

Конечно, вы можете утверждать, что вы можете переписать его в соответствующую форму, либо изменив порядок соединения, либо используя подзапросы (встроенные представления). С точки зрения разработчика всегда полезно иметь инструменты (даже если вам не нужно их использовать)

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