哪个更有效,将条件放在JOIN中:
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 :(得分: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 :(得分:0)
join中的条件只会连接特定条件匹配的特定表中的行,而where子句中的条件将过滤掉整个结果集。像table2有10行,对于特定条件,表2有3行,所以在连接中应用条件时,你将获得左表中的所有行,即table1,但是当在where子句中应用条件时,你将获得table1中table2的条件匹配的行,而不是table1的所有行
答案 2 :(得分:0)
他们的效果不是或多或少,他们在功能上有所不同。
如果没有过滤器,则会将主设备中的所有记录连接到子设备中匹配的记录
select * from t1
left join t2 on t1.a = t2.c
使用where,并对子表进行过滤,此连接将等同于内连接
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
使用where,过滤主表,这会过滤主表记录
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
a b c d
----------- ----------- ----------- -----------
1 2 1 9
1 3 1 9
2 4 2 5
3 3 NULL NULL
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