условное соединение - насколько интеллектуально MySQL будет обрабатывать неявную информацию - PullRequest
0 голосов
/ 07 февраля 2011

только что наткнулся на соединение, которое необходимо только при соблюдении определенного условия.

Поэтому я подумал, как отказаться от объединения, если в этом нет необходимости.

Некоторые поиски в Google и исследование SO поставили меня перед довольно сложными вопросами, связанными с профсоюзами и т. Д.

Позвольте мне показать вам простой пример для двух таблиц t1 и t2 с двумя полями id и val.

SELECT t1.id, t1.val, t2.val
FROM t1 
JOIN t2 ON t1.id = t2.id

Теперь t1.val может иметь специальное значение -1, что делает объединение лишним, потому что тогда t2.val всегда равен NULL.

SELECT t1.id, t1.val, IF(t1.val = -1, NULL, t2.val)
FROM t1 
JOIN t2 ON t1.id = t2.id

Итак, если я присоединяюсь, и каждая ссылка на поле из объединенной таблицы является условной, а условие не выполняется, значит, объединение определенно излишне ... MySQL распознает это и отказывается от объединения?

Потому что моя математическая интуиция говорит мне, что это стандартная ситуация, которая должна эффективно обрабатываться профессиональной базой данных, такой как MySQL.

Имеет ли кто-нибудь инсайдерскую информацию об этом?

С наилучшими пожеланиями

Раффаэль

1 Ответ

0 голосов
/ 07 февраля 2011

Условие соединения (t1.id = t2.id, в примере) является единственным критерием для определения строк результата. Поскольку значение t1.val не указано в условии соединения, оно не повлияет на то, что включено или не включено. Если вы хотите исключить строки, когда t1.val равно -1, включите тест в условие объединения:

SELECT t1.id, t1.val, t2.val
  FROM t1 
    JOIN t2 ON t1.id = t2.id AND t1.val != -1

Если вы все еще хотите, чтобы строки из t1, где t1.val=-1 появлялись в результате, используйте [LEFT JOIN] 1 , который также будет включать все строки из t1, где в t2 нет строки с таким же идентификатором:

SELECT t1.id, t1.val, t2.val
  FROM t1 
    LEFT JOIN t2 ON t1.id = t2.id AND t1.val != -1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...