Странный результат выполнения SQL в Oracle
select unique owner
from all_tables
where sysdate-50 < (select last_analyzed from dual);
Я только что написал код выше, и странно, что результат отличается от кода ниже.
select unique owner from all_tables;
Однако, если я выполню (select last_analyzed from dual
) отдельно выскочит ошибка.
Я запутался, как получается результат.
3 ответа
Это берет last_analysed
как столбец из all_tables
, поскольку в dual
- это влияние масштаба, я полагаю. Понятнее, если он написан с псевдонимом:
select unique owner
from all_tables t
where sysdate-50 < (select t.last_analyzed from dual);
Вам не нужен подзапрос вообще, вы можете просто сделать:
select unique owner
from all_tables
where last_analyzed >= sysdate-50;
(что, я подозреваю, неверно; если вы ищете устаревшую статистику, я предполагаю, что вы хотите < sysdate-50
).
Ваш запрос содержит ненужный подзапрос. Это эквивалентно:
select unique owner from all_tables T
where sysdate-50 < T.last_analyzed;
Я надеюсь, что это поможет вам понять результаты, которые вы получаете.
last_analyzed является одним из столбцов all_tables, который имеет значение даты. Вы не можете запустить подзапрос в одиночку