SQL LEFT JOIN с дополнительным условием, добавленным в ON - PullRequest
0 голосов
/ 21 января 2019
table: users
+----+-------+
| id | name  |
+----+-------+
|  1 | alpha |
|  2 | beta  |
|  3 | gamma |
+----+-------+

table: address
+----+---------+------+--------------+
| id | user_id | type |   address    |
+----+---------+------+--------------+
|  1 |       1 | PRA  | welcome      |
|  2 |       1 | COA  | to the hotel |
|  3 |       2 | PRA  | california   |
+----+---------+------+--------------+

Я понимаю результат этого запроса:

select u.*, a.*
from ccr.SJ_TEMP_USERS u
LEFT JOIN SJ_TEMP_ADDRESS a
on u.id = a.USER_ID
WHERE a.id IS NULL;
+----+-------+--------+---------+--------+---------+
| ID | NAME  |  ID_1  | USER_ID |  TYPE  | ADDRESS |
+----+-------+--------+---------+--------+---------+
|  3 | gamma | (null) | (null)  | (null) | (null)  |
+----+-------+--------+---------+--------+---------+

Но я не понимаю результат этого запроса.

select u.*, a.*
from ccr.SJ_TEMP_USERS u
LEFT JOIN SJ_TEMP_ADDRESS a
on u.id = a.USER_ID
and a.type = 'COA'
WHERE a.id IS NULL;

+----+-------+--------+---------+--------+---------+
| ID | NAME  |  ID_1  | USER_ID |  TYPE  | ADDRESS |
+----+-------+--------+---------+--------+---------+
|  3 | gamma | (null) | (null)  | (null) | (null)  |
|  2 | beta  | (null) | (null)  | (null) | (null)  |
+----+-------+--------+---------+--------+---------+

Пожалуйста, помогите мне понять, почемуЯ получаю строку с «бета» во втором запросе.(Я использую Oracle SQL Developer).

Обратите внимание, что строка с «альфа» не появляется, если я поставлю условие a.type = 'PRA' вместо a.type = 'COA'

Ответы [ 2 ]

0 голосов
/ 21 января 2019

что вы пытаетесь сделать, это получить несопоставленные записи из этих двух таблиц.то есть когда вы говорите

u.id = a.USER_ID and a.type = 'COA'  

из таблицы SJ_TEMP_ADDRESS, это соответствует только одной записи, а

WHERE a.id IS NULL

дает несопоставленные записи из таблицы SJ_TEMP_ADDRESS.То же самое происходит, когда вы задаете условие a.type = 'PRA', поскольку существует тип альфа, равный pra, он совпадает со второй таблицей, и вы получите только бета-запись

0 голосов
/ 21 января 2019

Предложение where имеет место после присоединения.Предложение on применяется к самому соединению, поэтому дополнительное добавление a.type = 'COA' к предложению on исключит больше адресов, оставляя результаты таблицы пользователей неизменными (пока вы не начнете фильтрацию с помощью предложения where).

Конкретнее:

В первом запросе вы говорите: «Дайте мне все строки, для которых нет соответствующего адреса (вообще)».Это верно только для Gamma, поскольку адрес user_id 3. отсутствует.

Во втором запросе вы говорите: «Дайте мне все строки, для которых нет соответствующего адреса типа« COA », чтоверно для Gamma и Beta, потому что адрес Beta другого типа.

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