使用Sql Server 2008,我们有一个查询连接两个表Customer和Customer_Info,这些列看起来像
客户
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正在使用嵌套逻辑做错事件
感谢您的帮助
答案 0 :(得分:0)
它与SQL查询中的LEFT JOIN有关。如果是INNER JOIN,你的期望是正确的。在LEFT JOIN(或RIGHT JOIN)的情况下,首先应用连接条件,然后完成连接。因此左表上的每个谓词(即使它是带有多个OR谓词的AND)实际上会减少用于最后左连接的行数。 [reference]