2009-06-04 37 views
1

警告是什么意思?Toad for Oracle格式化程序的建议

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

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

FYI:这两个查询运行正常,并返回相同的结果。

+0

任何猜测都是可以的。 – Steven 2009-06-04 22:59:00

回答

1

撇开表格的数据量,索引和收集的统计数据;一般而言,未知的子查询应该胜过嵌套子查询

0

我的猜测:看起来TOAD不像Oracle那样解析查询。

在第一个查询中,TOAD可能检查lims.sample和lims.product的表定义,并在两者中找到列“product_id”,所以没关系。

在第二个查询中,TOAD无法检查第一部分连接的表定义,因为它是嵌套查询;所以也许它放弃并给你这个建议(这就是为什么建议说“......或者它指的是一个标签”,这可能是一个copout)。

我会忽略这个实例的建议,特别是它运行良好并返回相同的结果。

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)