2014-02-12 5 views
0

Использование Sql Server 2008 у нас есть запрос, соединяющую две таблицы Customer и Customer_Info столбцы похожиSQL Server внешнее соединение с несколькими или условиями

Заказчик

visit_date 
    customer_seq_num 

Customer_Info

customer_seq_num 
    customer_detail_number 
    customer_value 

в по этому запросу выглядит так:

Customer 
    left outer join Customer_Info 
     on Customer_Info.customer_seq_num = Customer.customer_seq_num 
     and Customer_Info.customer_detail_number = 31 
     and (
      (right(Customer_Info.customer_value,4)='8788' and month(visit_date)=2) or 
      (right(Customer_Info.customer_value,4)='8808' and month(visit_date)=12)or 
      (right(Customer_Info.customer_value,4)='8891' and month(visit_date)=9) 
     ) 

проблема заключается в том, что если я запустил запрос, я получаю 400 записей. Если я удалить первое условие из «и части», что означает я закомментировать

--(right(Customer_Info.customer_value,4)='8788' and month(visit_date)=2) or 

я получить больше результатов .... не следует то, как или-х и и расположены потому что возвращаться более или такое же количество записей для каждой из этих записей? почему бы удалить или вызвать больше записей для возврата? Похоже, что SQL Server делает soemthing нечетное с вложенной логикой

спасибо за любую помощь

+0

Вы имеете в виду «меньше или столько же записей»? – user2989408

+0

Я согласен с вашим ожиданием. Вы уверены, что '400' - это общее количество строк? Многие программы показывают только первые X строк запроса, которые возвратят больше. – SebastianH

+0

Я так не думаю. Он постоянно показывает те же два числа, когда я запускаю с этим условием или без него. я бы не увидел такой же номер, если я использую (студия управления сервером sql server), если бы он просто отрубал в какой-то момент – user1023993

ответ

0

Это связано с LEFT JOIN в запросе SQL. Если бы это было ИНТЕРНЕТНОЕ ПРИСОЕДИНЕНИЕ, ваше ожидание было бы правильным. В случае LEFT JOIN (или RIGHT JOIN) сначала применяются условия соединения, а затем соединение выполняется. Таким образом, каждый предикат на левой таблице (даже если это И с несколькими предикатами ИЛИ) фактически уменьшит количество строк, которые используются для последнего левого соединения. [reference].

+0

, так что вы говорите, что с месяца критерии применяются к первичной таблице, а не к внешней объединенной таблице ... что приводит к ее сокращению. Если я выберу условие, то факт, что это внешнее соединение, позволяет тем же самым записям теперь войти? – user1023993

+0

Хммм, я, возможно, подпрыгнул пистолет. Мой ответ связан с тем, где применяются предикаты: в предложении FROM или в предложении WHERE. Это явно не так в примере, который вы показываете. – Gummyball

+0

Мое предположение - инструкция OR фильтрует отношения 1: M, которые присутствуют в обеих таблицах. В Customer_Info есть несколько строк, указывающих на одну и ту же строку Customer. Что мне кажется странным, так это то, что 1: M уже появляется, если вы удаляете один оператор OR. Не могли бы вы обновить свой вопрос, а также показать предложение SELECT, которое вы используете? И, возможно, вы могли бы опубликовать некоторые записи, которые появляются, когда вы удаляете инструкцию OR? – Gummyball

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