2014-02-19 74 views
1

哪個更有效,把條件在JOIN:JOIN或WHERE中的條件?

SELECT * FROM table1 
LEFT JOIN table2 ON 
    table1.id=table2.fk AND 
    table1.field1='some' AND 
    .... 

或者放在WHERE:

SELECT * FROM table1 
LEFT JOIN table2 ON 
    table1.id=table2.fk 
WHERE 
    table1.field1='some' AND 
    .... 
+0

where條款中的條件 –

+0

@Dot_NETJunior你簡直是錯誤的 – Alexander

+0

@Alexander看我的答案我的意思是 –

回答

1
SELECT t2.name 

FROM table1 t1 

INNER JOIN table2 t2 ON t1.h_id = t2.h_id 

WHERE t1.Date = CURDATE() 

另一種可能性是在where子句中,嘗試這樣的:

SELECT t2.name 
FROM table1 t1 
INNER JOIN table2 t2 ON t1.h_id = t2.h_id 
WHERE convert(varchar, t1.Date, 112) = convert(varchar, getdate(), 112) 
+1

這是一個答案嗎?如果是這樣,我沒有跟着。你能擴展它嗎? – Alexander

0

連接中的條件將只加入特定表中的行,其中s特定條件匹配,而where子句中的條件將過濾掉整個結果集。就像table2有10行一樣,對於特定的條件,表2有3行,所以當在連接中應用條件時,你將得到左表中的所有行,即table1,但是當在where子句中應用條件時,你將得到table1中的行,其中table2的條件匹配,並非來自表1的所有行

0

它們沒有更多或更少有效,它們在功能上不同。

沒有濾波器,此連接中的所有記錄從主站到那些使用其中在附屬

select * from t1 
    left join t2 on t1.a = t2.c 

匹配和過濾的子公司表,這個連接將等同於內連接

select * from t1 
    left join t2 on t1.a = t2.c 
where t2.d=5 

使用連接,並在子公司表過濾,這種過濾子公司表的記錄

select * from t1 
    left join t2 on t1.a = t2.c and t2.d=5 

使用,其中,在主表篩選,該過濾器主表中的記錄使用join

select * from t1 
    left join t2 on t1.a = t2.c 
where t1.b = 3 

,這個過濾器在主記錄可以加入,但仍從主返回所有記錄。

select * from t1 
    left join t2 on t1.a = t2.c and t1.b = 3 

所以給出如下表

表T1

a   b 
----------- ----------- 
1   2 
1   3 
2   4 
3   3 

表T2

c   d 
----------- ----------- 
1   9 
4   5 
2   5 

結果

QUERY1

QUERY2

a   b   c   d 
----------- ----------- ----------- ----------- 
2   4   2   5 

QUERY3

a   b   c   d 
----------- ----------- ----------- ----------- 
1   2   NULL  NULL 
1   3   NULL  NULL 
2   4   2   5 
3   3   NULL  NULL 

query4

a   b   c   d 
----------- ----------- ----------- ----------- 
1   3   1   9 
3   3   NULL  NULL 

QUERY5

a   b   c   d 
----------- ----------- ----------- ----------- 
1   2   NULL  NULL 
1   3   1   9 
2   4   NULL  NULL 
3   3   NULL  NULL 
相關問題