2010-06-09 42 views
4

我已經寫了相同的查詢作爲子查詢和自連接。哪些查詢更可取?

在這裏有一個比另一個有任何明顯的爭論?

SUBQUERY:

SELECT prod_id, prod_name 
FROM products 
WHERE vend_id = (SELECT vend_id 
FROM products 
WHERE prod_id = ‘DTNTR’); 

自聯接:

SELECT p1.prod_id, p1.prod_name 
FROM products p1, products p2 
WHERE p1.vend_id = p2.vend_id 
AND p2.prod_id = ‘DTNTR’; 
+0

那麼,對於初學者來說,如果給定產品有多個vend_id,他們會返回不同的結果,我想。我想你可能打算在子查詢中使用「IN」,而不是「=」。不過,我可能是錯的,我只是剛剛喝上一杯咖啡。 – 2010-06-09 08:39:48

+0

請添加(作爲標籤)您的數據庫引擎。編寫查詢的最佳方式可能取決於數據庫引擎。 – 2010-06-09 08:47:53

回答

2

This postThis post有一些關於執行時間的數字。海報說:

第一個查詢顯示該批次而第二個顯示50.8%的49.2%,領先 一個想到的是,子查詢是稍快。

現在,我啓動了Profiler並運行了兩個查詢。第一個查詢需要 超過92,000個讀取執行,但加入的只需要2300, 使我相信內部連接速度要快得多。

有衝突的反應,但:

我的經驗法則:只使用,如果你需要輸出從 表你join'ing一列JOIN的;否則,使用子查詢。

這:

加盟應該總是快 - 理論上和現實。子查詢 - 特別相關 - 可能非常難以優化。如果你認爲 關於它,你會看到爲什麼 - 從技術上講,子查詢可以爲外部查詢的每一行執行一次 - blech!

我也同意Madhivanan,如果子查詢返回的任何東西,但一個值你的主要查詢將失敗,所以使用IN來代替。

3

首先查詢,如果子查詢返回的值以下更可能會引發錯誤

第二個查詢是不是根據ANSI

因此更好地利用ANSI風格加入

SELECT p1.prod_id, p1.prod_name 
FROM products as p1 inner join products as p2 
on p1.vend_id = p2.vend_id 
WHERE p2.prod_id = ‘DTNTR’; 
0

如果您不需要任何列從連接表,然後使用子查詢通常是優選的,雖然這是依賴於RDBMS類型。應使用IN子句代替:

SELECT prod_id, prod_name 
FROM products 
WHERE vend_id IN (SELECT vend_id 
    FROM products 
    WHERE prod_id = ‘DTNTR’);