2010-12-23 23 views
2

例如,我有這樣的查詢。通過聯接替換子查詢有意義嗎?

select col1 from t1 where col2>0 and col1 in (select col1 from t2 where col2>0) 

據我瞭解,我可以通過下面的查詢替換它:

select t1.col1 from t1 
join (select col1 from t2 where col2>0) as t2 
on t1.col1=t2.col1 
where t1.col2>0 

ADDED

在一些答案我在其他inner join看到join。都對嗎?或者他們甚至完全相同?

+0

我不知道MySQL ...但我非常確定`JOIN` *往往會在SQL Server和Oracle中更快。 – rsenna 2010-12-23 15:23:01

+0

您在這裏的加入仍在使用子查詢,因此不會使其更快。 – Danosaure 2010-12-23 15:27:08

+0

就JOIN類型而言,從內存中,我認爲JOIN相當於INNER JOIN也可以看看這裏http://www.wellho.net/mouth/158_MySQL-LEFT-JOIN-and-RIGHT-JOIN-INNER- JOIN-and-OUTER-JOIN.html – Jaydee 2010-12-23 15:39:00

回答

1

這是你想要做什麼?

select col1 from t1 
inner join t2 ON t2.col1 = t1.col1 
where t1.col2>0 and t2.col2>0 

A JOIN肯定是去這裏

1

更妙的辦法:

select t1.col1 
    from t1 
     inner join t2 
      on t1.col1 = t2.col1 
    where t1.col2>0 
     and t2.col2>0 
1

其實這是足夠

select t1.col1 
from t1 join t2 On t2.col1 = t1.col1 
Where t1.col2 > 0 
    and t2.col2 > 0 

至於這是更快,唯一的辦法一定要測試。但我會建議,除非性能是一個真正的用戶體驗問題,否則更重要的問題是長期可維護性,因爲SQL的清晰度是一個主要因素。在我看來,子查詢方法表達了您正在執行的功能更清晰

2

聯接通常更快,但決定的最佳方法是進行基準測試。

0

以及如何對這樣的事情:

select t1.col1 from t1 join t2 On t2.col1 = t1.col1
AND t1.col2 > 0

1

這樣的問題你應該去在任何情況下

select t1.col1 
from t1 join t2 On t1.col1 = t2.col1 
where t1.col2 > 0 and t2.col2 > 0 

聯接並有間「加入」無差異, 「內部聯接」。 「內部」可以省略,因爲它是默認值;只需指定其類型的「外部」。然而,如果你這樣寫,「連接」也可以省略:

select t1.col1 
from t1, t2 
where t1.col2 > 0 and t2.col2 > 0 
    and t1.col1 = t2.col1 
1

什麼是合理的取決於你的編碼標準。

我會避免基準子查詢vs連接,直到查詢本身已被優化(刪除多餘的連接,同義詞where子句,過度列檢索)和分析表明需要優化特定的查詢。儘管如此,您的時間可能會更好地用於定義RDBMS在執行過程中使用的良好索引。

0

在許多情況下,查詢優化器會將您的子查詢重寫爲連接。如果您的子查詢是其中的一個,重寫它將浪費時間。但是,如何判斷是否屬於這種情況,我不知道。如果你當前的查詢是一個問題,EXPLAIN命令可能會幫助你。