Почему этот запрос вызывает объединение декартовых объединений в Oracle - PullRequest
4 голосов
/ 18 июня 2010

У меня есть запрос, который недавно нужно было изменить.

Вот оригинал

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() возвращает дату начала финансового года параметра даты.Первый запрос выполняется нормально, а второй создает объединение декартовых слияний.Я посмотрел на индексы в таблицах и обнаружил, что позиция и дата были проиндексированы.Мой вопрос к вам: stackoverflow: почему добавление y.date = get_fiscal_year_start_date (SYSDATE) вызовет объединение декартовых объединений в Oracle 10g.

1 Ответ

10 голосов
/ 18 июня 2010

Проблема в том, что 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 имеет одну строку и, следовательно, подзапрос вернет одно значение.

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