2012-01-16 4 views
8

Выполняю два запроса и получаю странный результат. Я хотел бы знать, почему это происходит.
Теперь запросы:Противоречивый результат запроса Oracle

SELECT * FROM TABLE_A a, TABLE_B b, TABLE_C c 
    WHERE a.a = b.a (+) 
    AND b.c = c.c 
    AND a.a = 123; 

Результат пуст.

SELECT COUNT(*) FROM TABLE_A a, TABLE_B b, TABLE_C c 
    WHERE a.a = b.a (+) 
    AND b.c = c.c 
    AND a.a = 123; 

Результат 1.

Это действительно тот же запрос с различным возвращаемым значением.
Таблица A содержит строку с полем 'a' = 123.
Таблица B не содержит строк как a.a = b.a.

Как можно вернуть ничего или 1 для одного и того же запроса?


Update:

Когда я делаю это так

SELECT COUNT(*) FROM TABLE_A a, TABLE_B b, TABLE_C c 
    WHERE a.a = b.a (+) 
    AND b.c = c.c (+) 
    AND a.a = 123; 

Он работает нормально.

+16

Измените свой запрос с помощью синтаксиса ANSI-92 ('LEFT JOIN' и т. Д.), А затем попробуйте. Мне 20 лет, я думаю, что настало время спать! – MatBailie

+1

Как насчет 'TABLE_C'? что в нем? – gdoron

+2

@Dems. Черт, мне жаль, что я не мог +1 больше одного раза ... –

ответ

1

Возможно, у вас есть индексы или ограничения внешнего ключа, которые не соответствуют данным таблицы. Поскольку эти два запроса, скорее всего, используют разные индексы, они возвращают несогласованные данные.

Вы временно отключили constrataints или установили их, не подтвердив, что они изначально были действительными (ENABLE NOVALIDATE)?

Попробуйте перестроить индексы и сбросить и воссоздать ограничения внешнего ключа, чтобы узнать, устраняет ли это вашу проблему.

Смежные вопросы