2009-06-04 38 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)