Есть ли способ уйти, не написав дважды подзапрос левого соединения? - PullRequest
0 голосов
/ 15 сентября 2018

Мой SQL не такой сильный, как мог бы быть.Это другой способ мышления по сравнению с написанием C #.Я работаю над запросом и переписываю его, используя «left join / is null», чтобы уйти от синтаксиса «not in».

select t1.id, t2.col1
from table1 t1
join table2 t2 on t1.id = t2.id
left join (select sub.id from ratherLargeSubquery sub) s1
   On s1.id = t1.id
left join (select sub.id from ratherLargeSubquery sub) s2
   On s2.id = t2.id
where
s1.id is null and
s2.id is null

Можно ли как-то уйти от написания довольно большого количества дважды?Я пробовал

select t1.id, t2.col1
from table1 t1
join table2 t2 on t1.id = t2.id
left join (select sub.id from ratherLargeSubquery sub) s1
   On (s1.id = t1.id and t2.id = s1.id)
where
s1.id is null

, но, конечно, он возвращает те же результаты, как если бы я никогда не добавлял левое соединение в первую очередь, а

select t1.id, t2.col1
from table1 t1
join table2 t2 on t1.id = t2.id
left join (select sub.id from ratherLargeSubquery sub) s1
   On (s1.id = t1.id or s1.id = t2.id)
where
s1.id is null

Просто работает более 20 раздлительность исходного запроса без всякого возврата результатов.

Вернемся к вопросу, есть ли способ написать его без написания LargeSubquery дважды

Ответы [ 4 ]

0 голосов
/ 15 сентября 2018

Я почти не решаюсь опубликовать это, поскольку многие знающие авторы не упомянули об этом, но почему бы не распространенное табличное выражение?

Я понимаю, что ваше истинное возражение состоит не в том, чтобы иметь два левых соединения, а в том, чтобы дублировать логику "довольно большого запроса".

with cte AS ( SELECT sub.id FROM ratherLargeSubquery sub )
select t1.id, t2.col1
from table1 t1
join table2 t2 on t1.id = t2.id
left join cte s1
   On s1.id = t1.id
left join cte s2
   On s2.id = t2.id
where
s1.id is null and
s2.id is null
0 голосов
/ 15 сентября 2018

Кажется, что SQL на самом деле не нуждается во втором левом соединении.

Потому что t1.id = t2.id
Итак, s1.id = s2.id

select t1.id, t2.col1
from table1 t1
join table2 t2 on t1.id = t2.id
left join (select id from ratherLargeSubquery) s1
   on s1.id = t1.id
where s1.id is null 
0 голосов
/ 15 сентября 2018

Используйте s.id in (t1.id, t2.id) для условия соединения:

select t1.id, t2.col1
from table1 t1
join table2 t2 on t1.id = t2.id
left join (select sub.id from ratherLargeSubquery sub) s
   on s.id in (t1.id, t2.id)
where s.id is null
0 голосов
/ 15 сентября 2018

Поскольку вы не выбираете ни одного столбца из подзапроса, вы можете переместить фильтрацию в предложение where.

select t1.id, t2.col1
from table1 t1 join
     table2 t2
     on t1.id = t2.id 
where not exists (select 1
                  from ratherLargeSubquery sub
                  where sub.id = t1.id or sub.id = t2.id
                 );

Это упрощает написание запроса. Однако у Oracle могут возникнуть проблемы с его оптимизацией.

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