Разница между "Где" и "Присоединиться" по идентификатору - PullRequest
1 голос
/ 01 апреля 2019

Я недавно видел этот запрос, который находит все стороны, на которые клиент может пойти:

SELECT *
FROM Party
    INNER JOIN Organizer on Organizer.OrganizerId = Party.OrganizerId
    LEFT JOIN Client on Client.ClientID = 1
    LEFT JOIN PartyRegistration on PartyRegistration.PartyId = Party.PartyId
WHERE Party.OrganizerId = 0
    AND (Party.HasGuestList = 0 OR PartyRegistration.ClientId = Client.ClientId)

Я никогда раньше не видел объединения по определенному значению. Нормально ли видеть такой код SQL?

У меня мало знаний о левых соединениях, но это может относиться к любому объединению, например, как это будет:

SELECT *
FROM Party
    INNER JOIN Organizer on Organizer.OrganizerId = 0

сравните с этим, поскольку результаты одинаковы:

SELECT *
FROM Party
    INNER JOIN Organizer on Organizer.OrganizerId = Party.OrganizerId
WHERE Organizer.OrganizerId = 0

Ответы [ 3 ]

2 голосов
/ 01 апреля 2019

Это очень хорошая практика - на самом деле, вы не можете (легко) получить эту логику в предложении WHERE.

A LEFT JOIN возвращает все строки в первой таблице - даже если во второй нет совпадений.

Таким образом, это возвращает все строки в предыдущих таблицах - и любые строки из Client, где ClientId = 1. Если для этого ClientId совпадения нет, то столбцы будут NULL, но строки не фильтруются.

1 голос
/ 01 апреля 2019

Это может быть только вопросом хорошей / плохой практики, если сравнивать с альтернативой. Помещение теста в левое соединение против a, где выполняется две разные вещи, так что это не вопрос хорошей / плохой практики.

Если это правильное условие левого соединения, то есть вы хотите, чтобы строки внутреннего соединения были в этом условии плюс несопоставленные строки левой таблицы, то это условие левого соединения. Это никуда не денется.

Узнайте, какое левое соединение возвращается: внутреннее соединение строк плюс несопоставленные строки левой таблицы, расширенные нулями. Всегда знайте, какое внутреннее соединение вы хотите использовать как часть левого соединения.

0 голосов
/ 01 апреля 2019

Это правда.Левое объединение по определенному значению действительно плохая практика.Но иногда нам может понадобиться все столбцы из одной таблицы, хотя у нас нет общих столбцов для соединения и требуется объединение по определенному условию, например, A = «некоторое значение».В этом случае добавление LEFT JOIN при определенных условиях плохой практики, хотя мы можем немного лучше, ниже приведен обновленный код, пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы, я был бы рад помочь вам в этом.

SELECT *
FROM Party
    INNER JOIN Organizer on Organizer.OrganizerId = Party.OrganizerId
    LEFT JOIN Client USING(CLIENTID)
    LEFT JOIN PartyRegistration on PartyRegistration.PartyId = Party.PartyId
WHERE CLIENTID=1 AND Party.OrganizerId = 0
    AND (Party.HasGuestList = 0 OR PartyRegistration.ClientId = Client.ClientId)
...