警告意味着什么?
为什么第二个例子比第一个更差?
SELECT product_id, prod.name name, sample_id
FROM lims.sample JOIN lims.product prod USING (product_id)
VS
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.
*/
仅供参考:两个查询都运行良好并返回相同的结果。
答案 0 :(得分:1)
将表中的数据,索引和收集的统计信息放在一边;一般来说,无效子查询 应优于嵌套子查询。
答案 1 :(得分:0)
我的猜测:看起来TOAD没有像Oracle那样解析查询。
在第一个查询中,也许TOAD会检查lims.sample和lims.product的表定义,并在两者中找到列“product_id”,所以没关系。
在第二个查询中,TOAD无法检查连接的第一部分的表定义,因为它是嵌套查询;所以也许它放弃并给你这个建议(这就是为什么建议说“......或者它指的是一个标签”,这可能是一个结论)。
我会忽略这个例子中的建议,特别是当它运行正常并返回相同的结果时。
答案 2 :(得分:0)
只是一个猜测,但在第二个查询中,您的子查询未命名 - 尝试给它一个别名;例如:
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)