1

警告是什么意思?

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

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

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

4

3 回答 3

1

将表的数据量、索引和收集的统计信息放在一边;一般来说,非嵌套子查询应该优于嵌套子查询

于 2009-06-04T23:32:12.413 回答
0

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

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

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

在这种情况下,我会忽略建议,尤其是当它运行良好并返回相同的结果时。

于 2009-06-05T02:04:12.280 回答
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)
于 2009-06-12T18:26:24.757 回答