题
什么是警告的意思吗?
为什么是第二示例比第一差?
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.
*/
供参考:这两个查询运行正常,并返回相同的结果
。解决方案
暂且不论表数据,索引的量,以及收集的统计数据;一般来说,的嵌套的子查询强>应的优于大嵌套子强>
其他提示
我的猜测:它看起来像蟾蜍不解析查询相同的方式,甲骨文将
。在所述第一查询,也许TOAD检查lims.sample和lims.product表定义,并且发现在所述列“PRODUCT_ID”,所以它的细
在第二个查询,TOAD不能检查表定义为的加入是因为它是一个嵌套查询的第一部分;因此,也许它给了,给你这个建议(这也是为什么建议说:“......或者它是指一个标签”,这可能是一个copout)。
我会在这种情况下忽略该建议,特别是因为它运行良好,并返回相同的结果。
只是一个猜测,但在第二个查询你的子查询未命名 - 尝试给它的别名;例如:
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)
不隶属于 StackOverflow