SQL алгоритм выполения

Есть запрос вида

with myselect as (select * 
                  from table1 
                  where column1 = 1)
select * 
from table2 
where column21  in (select column11 
                    from myselect) 
  and  column22  in (select column12 
                     from myselect);

Это тоже самое что

select * 
from table2 
where column21  in (select column11 
                    from table1 
                    where column1 = 1) 
  and  column22  in (select column12 
                     from table1 
                    where column1 = 1);

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

Как будет работать запрос в первом случае. Он сначала выберет с table1, потом будет в подзапросах выбирать с уже выбранного набора или же это синтетический сахар и все-равно будет выбирать каждый раз в подзапросах с table1? Может кто подскажет по алгоритму выполнения?


Ответы (1 шт):

Автор решения: Aziz Umarov

План выполнения что гадать, нужно посмотреть как посоветовал правильно @Akina

Это все хорошо то что вы делаете попробуйте так тоже

select distinct table2.* 
from table2 
   Inner join table1 AS table11
    On table11.column11 = table2.column21
       AND table11.column1 = 1
   Inner join table1 AS table12 
    On table12.column12 = table2.column22
       AND table12.column1 = 1

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

→ Ссылка