#sql #oracle
Если мы повторно обращаемся к таблице из основного запроса, рассматриваем мы её "с нуля" или в усеченном условиями варианте из основного вопроса. Например: SELECT DISTINCT IDX1.<столбец_1> FROM <таблица_1> IDX1 INNER JOIN <таблица_2> IDX2 ON IDX1.<столбец_n> = IDX2.<столбец_m> AND IDX2.<столбец_1> IN (<список>) WHERE NOT EXISTS (SELECT <таблица_1>.* FROM <таблица_1> IDX1 WHERE <условия>) Так вот, обращаясь к <таблице_1> в подзапросе, имеем ли мы дело с полной таблицей, или усеченной условием, наложенным при присоединении <таблицы_2>?
Ответы
Ответ 1
При обращении к таблице в подзапросе сработают только те условия, которые в этом подзапросе написаны. Справедливости ради надо заметить, что в подзапросе можно можно обращаться к таблицам более высокого уровня и тогда у них могут появляться общие условия. Например: Select * from Table1 t1 where exists (select 1 from Table1 t2 where t1.col1 = t2.col2)Ответ 2
В общем случае если целью является оптимизация, то можно воспользоваться WITH ... CLAUSE и хинтом MATERIALIZE: with view_name as ( select /*+ materialize */ from table_name where ... ) select ... from view_name v1 where col_name not in (select col_name from view_name); в вашем случае стоит попробовать вариант с разностью множеств и сравнить планы выполнения: SELECT DISTINCT IDX1.col1 FROM ( SELECT col1 FROM tab1 MINUS SELECT col1 FROM tab1 WHERE ... ) as IDX1 JOIN tab2 IDX2 ON IDX1.<столбец_n> = IDX2.<столбец_m> AND IDX2.<столбец_1> IN (<список>)'
Комментариев нет:
Отправить комментарий