代码之家  ›  专栏  ›  技术社区  ›  Steven

Toad对Oracle格式化程序的建议

  •  1
  • Steven  · 技术社区  · 15 年前

    警告是什么意思?

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

    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 回复  |  直到 15 年前
        1
  •  1
  •   tom    15 年前

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

        2
  •  0
  •   Jeffrey Kemp    15 年前

    我猜:看来蟾蜍不像甲骨文那样解析查询。

    在第一个查询中,也许toad检查lims.sample和lims.product的表定义,并在这两个表中都找到“product_id”列,这样就可以了。

    在第二个查询中,toad无法检查联接的第一部分的表定义,因为它是一个嵌套查询;因此,它可能放弃并向您提供此建议(这就是为什么建议说“…或者它指的是一个“可能是警察”的标签。

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

        3
  •  0
  •   Joe    15 年前

    只是猜测一下,但是在第二个查询中,您的子查询没有命名——请尝试给它一个别名;例如:

    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)