2013-02-13 3 views
5

Моя цель состоит в том, чтобы сделать именно то, что LEFT OUTER JOIN намерен сделать с помощью 4-й диаграмма Венна: SQL Diagrams:LEFT OUTER JOIN запрос не возвращает ожидаемые строки

enter image description here

Мой запрос не возвращает значения на самом деле, там, где на самом деле, он должен возвращать все в пределах Консалтинга_Memberships за вычетом того, который хранится в Consultant_Memberships_Lists.

Пожалуйста, смотрите SQL Fiddle для облегчения понимания:

SELECT * 
FROM consultant_memberships 
     LEFT OUTER JOIN consultant_memberships_list 
        ON consultant_memberships.`id` = 
         consultant_memberships_list.membership_id 
WHERE consultant_memberships_list.consultant_id = $id 
     AND consultant_memberships_list.membership_id IS NULL 

Запрос использует «5» в качестве идентификатора для демонстрационных целей, чтобы попробовать и выбрать правильные строки.

+1

В настоящее время на ваш вопрос почти нет информации, только ссылки на информацию в другом месте. Эти ссылки в порядке, но ваш вопрос также должен содержать необходимую информацию. – ruakh

+1

(Кроме того, ваша фразировка - «на самом деле, [мой запрос] должен быть [...]» - это похоже на то, что вы считаете, что правильно написали запрос, а СУБД просто работает неправильно. уверяю вас, это не так). – ruakh

+0

(Я согласен с руахом. Я изменил «правильный» на «ожидаемый» в названии и поощряю использование нейтрального/неаккуративного языка.) – 2013-02-13 20:00:54

ответ

13

Вы в настоящее время запрашиваете в основном INNER JOIN из-за consultant_id = 5 по статье WHERE. Я считаю, что вы на самом деле хотите использовать:

SELECT * 
FROM consultant_memberships m 
LEFT OUTER JOIN consultant_memberships_list l 
    ON m.`id` = l.membership_id 
    AND l.consultant_id = 5 
WHERE l.membership_id IS NULL; 

См SQL Fiddle with Demo

+0

@Bluefeet - Он отлично работает, и я узнал больше о LEFT OUTER JOIN в этом процессе. Спасибо за вашу помощь, я ценю это. – Ben

+1

@Svengali вы радушны, рады помочь. – Taryn

+2

+1 Этот предикат в предложении WHERE отрицает «внешнюю» неприменимость LEFT JOIN. Самый простой способ подумать о соединении OUTER заключается в следующем: если соответствующая строка не найдена, тогда создается фиктивная строка, чтобы возвращалась соответствующая строка. Эта порожденная фиктивная строка будет состоять полностью из значений NULL. Таким образом, любой предикат «IS NOT NULL» в предложении WHERE будет исключать все эти фиктивные строки, которые были сгенерированы. – spencer7593

2

Использование

SELECT * 
    FROM consultant_memberships 
     LEFT Outer JOIN consultant_memberships_list 
       ON consultant_memberships_list.membership_id = consultant_memberships.`id` 
       and consultant_memberships_list.consultant_id = 5 
where consultant_memberships_list.membership_id IS NULL; 

ИНЕКЕ использовали ранее в запросе «consultant_memberships_list.consultant_id = 5» пренебрегает левый внешнее соединение ,

+1

Возможно, было бы полезно, если бы вы упомянули, какое изменение вы внесли в запрос (т. Е. Перемещение предиката из предложения WHERE в предложение ON) и упоминание о том, почему это изменение необходимо. – spencer7593

Смежные вопросы