来自Toad for Oracle Formatter的建议

时间:2009-06-04 19:27:13

标签: sql oracle toad

警告意味着什么?

为什么第二个例子比第一个更差?

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.
*/

仅供参考:两个查询都运行良好并返回相同的结果。

3 个答案:

答案 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)