2014-02-19 2 views
1

Что является более эффективным, поставить условия в 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

Условия в том, что статья –

+0

@Dot_NETJunior вы просто ошибаетесь – Alexander

+0

@ Александр смотри на мой ответ, что я имею в виду –

ответ

1
SELECT t2.name 

FROM table1 t1 

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

WHERE t1.Date = CURDATE() 

Другая возможность заключается в том, где положение, попробуйте так:

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 строки, поэтому при применении условия в join вы получите все строки из левой таблицы, т.е. table1, но при применении условия в where where вы получите строки из таблицы 1, где условие 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 

с использованием где, фильтрация на мастер-таблицы, это фильтрует записи мастер-таблицы

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 
Смежные вопросы