Почему не доводя все строки из левой таблицы и показывать NULL для го e, которые не совпадают?
Причина, по которой ваш LEFT JOIN
не работал должным образом из-за условий на этой таблице в пункте WHERE
; это иногда называют «неявное внутреннее соединение».
Это лучше всего объясняется демонстрацией. Ниже приведены 2 простых таблиц
| USER_ID | FIRST_NAME | LAST_NAME |
|---------|------------|------------|
| 123 | Fred | Flintstone |
| 456 | Barney | Rubble |
| ID | USER_ID | NOTE_BODY |
|-------|---------|-----------------|
| 98765 | 123 | Yabba Dabba Doo |
Так как и следовало ожидать, внутреннее объединение производит только один ряд, где User_ID значения совпадают в обеих таблицах.
SELECT * FROM пользователей у INNER JOIN user_notes п ON u.User_ID = п.Идентификатор пользователя;
| USER_ID | FIRST_NAME | LAST_NAME | ID | NOTE_BODY |
|---------|------------|------------|-------|-----------------|
| 123 | Fred | Flintstone | 98765 | Yabba Dabba Doo |
И изменения в LEFT JOIN мы получаем все записи пользователей, но не все имеют информацию от User_Notes, так что мы получаем NULLs в этих колонках
SELECT * FROM пользователей у LEFT JOIN user_notes n ON u.User_ID = n.User_ID;
| USER_ID | FIRST_NAME | LAST_NAME | ID | NOTE_BODY |
|---------|------------|------------|--------|-----------------|
| 123 | Fred | Flintstone | 98765 | Yabba Dabba Doo |
| 456 | Barney | Rubble | (null) | (null) |
Но что произойдет, если мы действительно только хотите несколько записей из присоединяемой таблицы?
SELECT * FROM пользователей у LEFT JOIN user_notes п = О u.User_ID n.User_ID ГДЕ n.Note_Body = 'Yabba Dabba Ду';
| USER_ID | FIRST_NAME | LAST_NAME | ID | NOTE_BODY |
|---------|------------|------------|-------|-----------------|
| 123 | Fred | Flintstone | 98765 | Yabba Dabba Doo |
Ну, если мы используем условие WHERE, эффект такой же, как присоединиться к ВНУТРЕННЕЙ, теперь мы не получаем все записи пользователя и это неявный внутреннее соединение.
Причина, по которой мы не получаем все записи пользователя, состоит в том, что мы теперь настаивали на том, чтобы все строки результатов ДОЛЖНЫ иметь определенное значение в столбце, который может быть NULL. Таким образом, мы могли бы изменить условие WHERE
, чтобы разрешить NULL.
SELECT * FROM пользователей у LEFT JOIN user_notes п = О u.User_ID n.User_ID ГДЕ (n.Note_Body = 'Yabba Dabba Doo' ИЛИ n.Note_Body IS NULL);
| USER_ID | FIRST_NAME | LAST_NAME | ID | NOTE_BODY |
|---------|------------|------------|--------|-----------------|
| 123 | Fred | Flintstone | 98765 | Yabba Dabba Doo |
| 456 | Barney | Rubble | (null) | (null) |
ИЛИ
Вместо того, чтобы использовать ИНЕКЕ на присоединяемой таблицы мы добавим к условиям Join (ieafter ON)
SELECT * FROM пользователей у LEFT JOIN user_notes n ON u.User_ID = n.User_ID И n.Note_Body = 'Yabba Dabba Д ';
| USER_ID | FIRST_NAME | LAST_NAME | ID | NOTE_BODY |
|---------|------------|------------|--------|-----------------|
| 123 | Fred | Flintstone | 98765 | Yabba Dabba Doo |
| 456 | Barney | Rubble | (null) | (null) |
Итак, будьте осторожны при использовании внешних соединений, что ваш где положение не отменяют NULLs, что внешнее соединение позволяет.
See the above as a SQLFiddle demonstration
Что происходит, что каждый b.'Child Поставщик ID' из таблицы pdwspend могут отображаться сотни раз. Когда я присоединяюсь без него, он приносит каждое совпадение, поэтому у меня много повторяющихся строк. Я думаю, что лучшее решение может быть в этом отношении ... это также приводит к ошибке !: – nangys
SELECT a.'BW Parent Number', a.'Vendor Name', b.'Родитель Поставщик name' ОТ скрабы AS в LEFT OUTER JOIN ( SELECT DISTINCT' ребенка поставщика ID' ОТ pdwspend ГДЕ 'year' = 2014 И' БУ ID' = '' BU_1 И версия LIKE «% GOV% ') AS b ON a.'BW Родительский номер' = b.'Child ID поставщика ГДЕ a.'year' = 2014 # 1054 - Неизвестная колонка' b.Parent Supplier Name 'in' field list ' – nangys
Вы не включили 'b.Parent Supplier Name' внутри' select select subquery'. Пересмотрите запрос Брайана и скопируйте его –