Почему этот запрос вызывает объединение декартовых объединений в Oracle
У меня есть запрос, который недавно потребовалось изменить.
Вот оригинал
SELECT RTRIM (position) AS "POSITION",
. // Other fields
.
.
FROM schema.table x WHERE hours > 0
AND pay = 'RGW'
AND NOT EXISTS( SELECT position FROM schema.table2 y where y.position = x.position )
Вот новая версия
SELECT RTRIM (position) AS "POSITION",
. // Other fields
.
.
FROM schema.table x WHERE hours > 0
AND pay = 'RGW'
AND NOT EXISTS( SELECT position FROM schema.table2 y where y.date = get_fiscal_year_start_date (SYSDATE) AND y.position = x.position )
UDF get_fiscal_year_start_date()
возвращает дату начала финансового года параметра даты. Первый запрос выполняется нормально, а второй создает объединение декартовых слияний. Я посмотрел на индексы в таблицах и обнаружил, что позиция и дата были проиндексированы. Мой вопрос для вас stackru, почему бы добавление y.date = get_fiscal_year_start_date (SYSDATE)
вызвать слияние декартовых объединений в Oracle 10g.
1 ответ
Проблема в том, что Oracle не знает, что get_fiscal_year_start_date (SYSDATE)
возвращает один единственный результат. Поэтому предполагается, что он будет генерировать много строк.
Очевидно, у меня нет тестовой привязки, но эта версия вашего запроса должна исключить объединение декартовых объединений.
SELECT RTRIM (position) AS "POSITION",
. // Other fields
.
.
FROM schema.table x
, ( select get_fiscal_year_start_date (SYSDATE) as fiscal_year
from dual ) fy
WHERE hours > 0
AND pay = 'RGW'
AND NOT EXISTS( SELECT position
FROM schema.table2 y
where y.date = fy.fiscal_year
AND y.position = x.position )
Oracle знает, что DUAL имеет одну строку, и, следовательно, подзапрос вернет одно значение.