Состояние фильтра соединения SQL, MySQL - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть две таблицы, которые выглядят так (это пример того, что у меня есть на самом деле).

Таблица 1:

Yr, Value
1990, 1
1990, 2
1991, 2
1992, 3

Таблица 2:

Dte, Value2, ID
1/1/1990, 10, 1
1/2/1990, 11, 1
1/3/1990, 12, 2
1/1/1991, 20, 1
1/2/1991, 21, 2

Я хотел бы сначала объединить две таблицы, используя левое соединение, затем отбросить некоторые значения из объединенного набора, а затем сгруппировать по ID. Код, который я написал, выглядит примерно так:

    select avg(Value2) v2 
     from table2 
left join table1 on (year(dte)=yr) 
    where Value>1 
 group by ID;

Сначала выполняется соединение, а затем условие фильтра в операторе where отбрасывает строки из объединенной таблицы или сначала выполняется условие where, а затем соединение? Приведенный выше пример только для иллюстрации, и это более общий вопрос о том, как SQL выполняет операцию.

1 Ответ

3 голосов
/ 23 февраля 2012

это зависит от порядка, в котором указаны ваши таблицы, и порядка ваших where s.в этом случае, где выполняется позже.поэтому было бы более эффективно объявлять таблицы в обратном порядке, поскольку у вас есть предложение where для table1.

, как вы это делаете, все строки из table1 объединяются со строками из table2 с помощьюпо пункту, чтобы сузить его.затем, наконец, предложение where используется в результате объединения.однако, вот так:

   select avg(Value2) v2 
     from table1 
left join table2 on (year(dte)=yr) 
    where Value>1 
 group by ID;

предложение where сначала выполняется на table1, затем соединение выполняется с использованием предложения on.это делается на уже сокращенной версии table1, и поэтому она более эффективна.

...