Использование оператора where против левого внешнего соединения

У меня есть запрос, который возвращает ВСЕ встречи для консультанта за неделю и какие товары они продали на этой встрече (если они не были проданы, он все равно показывает встречу). Я сделал это, используя левое внешнее соединение в таблице назначений. и таблица элементов.

В этом сценарии я хочу отображать только проданные товары на складе (на складе - это поле в таблице товаров). Если я использую «где на складе правда» для товаров, я теряю все встречи, где товары не были проданы? Нужно ли мне как-то вкладывать эти запросы - если да, то как? Спасибо


person Steve B    schedule 22.03.2014    source источник
comment
Возможно, вам следует опубликовать свой текущий запрос   -  person GmG    schedule 22.03.2014


Ответы (2)


Ключ к тому, что вы хотите сделать, — переместить условие акции в предложение on из предложения where. Предположительно, ваш существующий запрос выглядит примерно так:

select <whatever>
from appointments a left join
     sells s
     on a.appointmentid = s.appointmentid 
where s.instock = 1;

Предложение where превращает left join в inner join. Если совпадения нет, значение instock равно NULL, что не соответствует 1. Решение состоит в том, чтобы переместить условие в предложение on:

select <whatever>
from appointments a left join
     sells s
     on a.appointmentid = s.appointmentid and
        s.instock = 1;
person Gordon Linoff    schedule 22.03.2014
comment
Спасибо - это как раз то, что мне было нужно (я не знал о предложении ON и всегда использовал WHERE) - person Steve B; 24.03.2014

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

SELECT A.*, S.* FROM appointments A LEFT JOIN sells S ON ... AND sells.instock = 1;

Я мог бы быть более точным, если бы у меня был SQL, который вы пытались написать.

person Pablo Francisco Pérez Hidalgo    schedule 22.03.2014