Советы от Toad для Oracle Formatter
Вопрос
Что означает предупреждение?
Чем второй пример хуже первого?
SELECT product_id, prod.name name, sample_id
FROM lims.sample JOIN lims.product prod USING (product_id)
против.
SELECT product_id, prod.name name, sample_id
FROM (SELECT sample_id, product_id FROM lims.sample)
JOIN lims.product prod
/* ADVICE: [131] This item has not been declared, or it refers to a label */
USING (product_id)
/* ADVICE:
ADVICE SUMMARY
Count Recommendation
----- --------------
1 [131] This item has not been declared, or it refers to a label
The Oracle equivalent error messages are PLS-00320 and
PLS-0321.
*/
К вашему сведению:Оба запроса выполняются нормально и возвращают одинаковые результаты.
Решение
Откладываем в таблицы объем данных, индексов и собранной статистики;в общем, невложенные подзапросы должен превосходить вложенные подзапросы.
Другие советы
Мое предположение:Похоже, что TOAD не анализирует запрос так, как это делает Oracle.
В первом запросе, возможно, TOAD проверяет определения таблиц для lims.sample и lims.product и находит столбец «product_id» в обоих, так что все в порядке.
Во втором запросе TOAD не может проверить определение таблицы для первой части соединения, поскольку это вложенный запрос;так что, возможно, он сдается и дает вам этот совет (именно поэтому в совете написано «...или это относится к метке», что, вероятно, является отговоркой).
В данном случае я бы проигнорировал совет, тем более что он работает нормально и возвращает те же результаты.
Просто догадайтесь, но во втором запросе ваш подзапрос не назван - попробуйте дать ему псевдоним;например:
SELECT product_id, prod.name name, sample_id
FROM (SELECT sample_id, product_id FROM lims.sample) samp
JOIN lims.product prod
USING (product_id)