Имеет ли значение порядок соединения в SQL (MySQL specific) - не таблица в предложении FROM



Это не дубликат этого Q&A , потому что вопрос и ответы здесь касаются таблицы, упомянутой в предложении FROM. А моя-нет.



Предполагая, что таблица в предложении FROM всегда одна и та же, и я никогда ее не изменю. Имеет ли значение, в каком порядке я добавляю свои соединения?



Я использую встроенный конструктор запросов. (Да, я знаю, что там уже есть вещи, но это выходит за рамки вопроса).



Я хочу иметь возможность установите некоторые соединения в начале моего сценария, а некоторые позже на основе условных выражений, построитель запросов добавляет их в запрос сверху вниз. Будет ли механизм SQL оптимизировать порядок соединений в любом случае, независимо от их порядка в запросе?



Пример:



SELECT a.col1, d.col2, c.col1, b.col3
FROM table1 A
INNER JOIN table2 B
ON B.a_id = A.id
LEFT JOIN table3 C
ON C.id = A.c_id
LEFT JOIN table4 D
ON D.id = C.d_id;

SELECT a.col1, d.col2, c.col1, b.col3
FROM table1 A
LEFT JOIN table4 D
ON D.id = C.d_id
INNER JOIN table2 B
ON B.a_id = A.id
LEFT JOIN table3 C
ON C.id = A.c_id;


Здесь вы можете видеть, что я объявил соединение для table4 D, прежде чем соединение для его зависимой таблицы будет объявлено в скрипте (C). Разве это имеет значение?

685   1  

1 ответ:

Простой ответ: Нет, вы не можете ссылаться на объект таблицы/псевдоним до объявления объекта.

MySQL выдаст ошибку на 2-м запросе. 'Unknown column' C. d_id ' in 'on clause'

Так что да... компилятор не смотрит вперед, чтобы увидеть, были ли ссылки на него позже.. Он только сначала знает порядок, а потом пытается выяснить, какой метод соединения лучше.

SQLFiddle

*чтобы решить вопрос: будет ли SQL-движок оптимизировать порядок присоединяется в любом случае, независимо от их порядка в запросе? *

Да, это оптимизирует порядок; но порядок " от " не может включать ссылку на таблицу до ее объявления, иначе запрос не будет компилироваться. (См. ошибку выше и ссылку, например)

Comments

    Ничего не найдено.