Как переписать левое соединение - PullRequest
0 голосов
/ 19 июня 2019

Пожалуйста, рассмотрите следующий запрос:

create table lt (id1 int, val1 string);
insert into lt VALUES  (1, "one"), (2, "two"), (3, "three");
create table rt (id2 int, val2 string);
insert into rt VALUES  (2, "two"), (3, "three"), (4, "four");

select * from lt left join rt on id1=id2;

+-----+-------+------+-------+
| id1 | val1  | id2  | val2  |
+-----+-------+------+-------+
| 1   | one   | NULL | NULL  |
| 2   | two   | 2    | two   |
| 3   | three | 3    | three |
+-----+-------+------+-------+

Для этого конкретного примера я могу переписать LEFT JOIN как INNER JOIN + запрос, который получает все идентификаторы, которых нет в таблице "rt":

select lt.*, NULL as id2, NULL as val2 from lt where id1 not in (select id2 from rt) 
union all
select * from lt join rt on id1=id2;
+-----+-------+------+-------+
| id1 | val1  | id2  | val2  |
+-----+-------+------+-------+
| 1   | one   | NULL | NULL  |
| 2   | two   | 2    | two   |
| 3   | three | 3    | three |
+-----+-------+------+-------+

Оба запроса дают одинаковый результат для этого примера.Но так ли это в целом?Могу ли я переписать любой LEFT JOIN таким образом (или, может быть, есть более короткий путь)?

1 Ответ

0 голосов
/ 19 июня 2019

Вы можете попробовать ниже -

DEMO

select val1, NULL as id2, NULL as val2 from lt where id1 not in (select id2 from 
rt) 
union 
select val1,id1, val1 from lt where 1=1 and id1 in (select id2 from rt)

ВЫВОД:

val1    id2 val2
one     
two     2   two
three   3   three
...