2013-11-01 36 views
0

我在兩個以上的表上應用連接,下面是where子句的一部分。 從以下兩種方式中選擇哪種方式更好?爲什麼?哪個查詢會更好?

where 
    d.bu_id  = 'ABC' 
and 
    hd.bu_id = 'ABC' 
and 
    s.bu_id  = 'ABC' 

OR

where 
    d.bu_id  = 'ABC' 
and 
    hd.bu_id = d.bu_id 
and 
    s.bu_id  = d.bu_id 
+0

你試過嗎?應該很容易測試。 – Andrew

+0

bu_id是每個表中唯一的嗎? – igr

+0

爲什麼這些不在'ON'子句中? – cmd

回答

2

的最佳解決方案實際上取決於你的預期變化的模式。如果三者都是相同的,因爲它們確實指的是同一實體,那麼它們似乎更有可能一起改變。在這種情況下,你會想要用第二種方法來避免重複自己。

如果他們只是碰巧有相同的價值,它更可能是他們中的一個將在未來單獨更改,因此你會保持它的第一個表單保存自己的麻煩。

如果你想了解的表現,沒有太大的區別,因爲任何查詢優化器應該能夠兩者弄清楚。

+0

感謝您的回答。 – user2946211

+1

至少在DB2 for i上講,SQE優化器並不關心謂詞是在WHERE子句還是JOIN ON子句中。它會在所決定的最有效的地方移動一個謂詞。 – WarrenT

1

我認爲最好的辦法是聲明一個變量來保存bu_id你正在尋找,然後joinhdsd一起bu_id。如果有必要,這將允許您在一個位置更改bu_id。在bu_id字段中添加索引應確保良好的性能。

DECLARE @bu_id CHAR(3) = 'ABC' 

SELECT 
    * 
FROM 
    table_d d 
    INNER JOIN table_hd hd on hd.bu_id = d.bu_id 
    INNER JOIN table_s s on s.bu_id = d.bu_id 
WHERE 
    d.bu_id = @bu_id 
+0

感謝您的回答,我有一個變量,保存bu_id但我沒有提到它的問題。你的回答後,我有另一個問題,如果我不提及內部連接條款,但只是提到上述表格的條件?它會有什麼不同? – user2946211

+0

我相信@couchand是正確的,你的例子之間的表現將是相同的。另外,你的例子和我的例子之間的表現也是一樣的。兩種方式都會導致內連接。使用'INNER JOIN'語法是ANSI-92標準,在'WHERE'子句中使用'='符號連接內部連接表,就像在第二個例子中一樣,是ANSI-89標準。 – StyxUT