MySQL множественное объединение и исключение - PullRequest
0 голосов
/ 29 ноября 2011

Я борюсь с 3 таблицами, к которым пытаюсь присоединиться и исключаю определенные результаты.По сути, это почти то же самое, что и mysql соединение, где не существует , однако я все еще не могу понять, как успешно объединить несколько таблиц.

Цель состоит в том, чтобы выбрать результаты из таблицы A, гдестрока в промежуточной таблице B равна нулю ИЛИ , где таблица C (связана с B, но не с A) не соответствует конкретному значению.

Что-то вроде:

SELECT      x 
FROM        tablea
LEFT JOIN   tableb
ON          tablea.x = tableb.x
LEFT JOIN   tablec
ON          tableb.y = tablec.y
WHERE       tableb.x IS NULL
OR          tablec.z != 'excluded'

, но это не работает.Я также хотел бы избежать подзапросов, таких как использование NOT IN или NOT EXISTS, чтобы ускорить процесс ... какие-либо предложения?

РЕДАКТИРОВАТЬ: несмотря на то, что я ранее сказал, это должно работать.Просто не забудьте перепроверить правильные скобки, вложение и положение «где» при объединении нескольких объединений

Ответы [ 2 ]

1 голос
/ 29 ноября 2011

Это должно сработать с одним запросом и быть достаточно быстрым.:)

SELECT x 
FROM tablea
    LEFT JOIN tableb ON tablea.x = tableb.x
    LEFT JOIN tablec ON tableb.y = tablec.y AND tablec.z != 'excluded'
WHERE
    tableb.x IS NULL
    OR tablec.y IS NOT NULL

Предполагается, что вы не возражаете получить строки из tablea, где оба файла tableb.x имеют значение null, а tablec.y имеет значение null или что ни один из них не равен.Если вам нужны только строки из таблицы, где tableb.x ИЛИ tablec.y содержит значения, вам нужно изменить ИЛИ на XOR.

0 голосов
/ 29 ноября 2011

Это на самом деле два отдельных запроса, поэтому используйте UNION:

SELECT tablea.*
FROM tablea
LEFT JOIN tableb ON tablea.x = tableb.x
WHERE tableb.x IS NULL
UNION
SELECT tablea.*
FROM tablea
LEFT JOIN tablec ON tableb.y = tablec.y AND tablec.z != 'excluded'

p.s. ваша жизнь станет проще, если вы не отформатируете свой SQL с этим безумным стилем «выравнивания имен таблиц». После многих лет кодирования SQL я считаю, что это легче всего читать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...