#sql #oracle
Предположим, есть таблицы TABLE_1 и TABLE_2. Мы хотим их сджойнить. Но при этом, мы мы знаем, что нет нужды джойнить всю таблицу TABLE_1, отсекая по дате нужные строки (может даже индекс есть на столбце с датой). Так вот. У нас есть два варианта джойна: SELECT * FROM TABLE_1 T1 JOIN TABLE_2 T2 ON T1.COL_1 = T2.COL_1 WHERE T1.COL_DATE between to_date(...) and to_date(...); И другой вариант SELECT * FROM TABLE_1 T1 JOIN TABLE_2 T2 ON T1.COL_DATE between to_date(...) and to_date(...) AND T1.COL_1 = T2.COL_1; Какой вариант эффективнее и по какой логике? Или вообще без разницы и запрос будет оптимизирован автоматически?
Ответы
Ответ 1
Если речь идет о INNER JOIN, что эквивалентно просто JOIN, то запросы вернут одинаковый результат, но первый вариант лично мне кажется более понятным. Исходные таблицы: SQL> select * from a; ID COL1 ---------- ---------- 1 11 2 12 3 13 3 rows selected. SQL> select * from b; ID COL2 ---------- ---------- 1 111 3 333 5 555 3 rows selected. Пример для INNER JOIN: SELECT * FROM a t1 JOIN b t2 ON t1.id = t2.id 4 WHERE t1.col1 between 12 and 13; ID COL1 ID COL2 ---------- ---------- ---------- ---------- 3 13 3 333 1 row selected. SELECT * FROM a t1 3 JOIN b t2 ON t1.id = t2.id AND t1.col1 between 12 and 13; ID COL1 ID COL2 ---------- ---------- ---------- ---------- 3 13 3 333 1 row selected. Для LEFT OUTER JOIN логика меняется потому что предикат WHERE будет исполнен уже после объединения, а в объединение (до фильтрования - применения предиката WHERE) попадут все строки из левой таблицы. Пример для LEFT OUTER JOIN (синоним LEFT JOIN): SELECT * FROM a t1 LEFT JOIN b t2 ON t1.id = t2.id WHERE t1.col1 between 12 and 13; ID COL1 ID COL2 ---------- ---------- ---------- ---------- 3 13 3 333 2 12 2 rows selected. SELECT * FROM a t1 3 LEFT JOIN b t2 ON t1.id = t2.id AND t1.col1 between 12 and 13; ID COL1 ID COL2 ---------- ---------- ---------- ---------- 3 13 3 333 1 11 2 12 3 rows selected.
Комментариев нет:
Отправить комментарий