Страницы

Поиск по вопросам

среда, 4 марта 2020 г.

Именование таблиц SQL в подзапросе

#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 (<список>)'

Комментариев нет:

Отправить комментарий