具有多个或条件的sql server外连接

Posted

技术标签:

【中文标题】具有多个或条件的sql server外连接【英文标题】:sql server outer join with multiple or conditions 【发布时间】:2014-03-11 06:31:32 【问题描述】:

使用 Sql Server 2008,我们有一个查询连接两个表 Customer 和 Customer_Info,列看起来像

客户

   visit_date
   customer_seq_num

客户信息

   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

我得到更多结果.... or 和 and 的排列方式不应该导致它为每个语句返回更多或相同数量的记录吗?为什么要删除或导致更多记录返回?似乎 sql server 对嵌套逻辑做了一些奇怪的事情

感谢您的帮助

【问题讨论】:

你的意思是less or the same number of records对吗? 我同意你的期望。您确定 400 是总行数吗?许多程序只向您显示查询的前 X 行,该查询会返回更多。 我不这么认为。当我在有或没有该条件的情况下运行时,它始终显示相同的两个数字。如果我使用的是什么(sql server managment studio),如果它只是在某个时候进行调整,我不会看到相同的数字 user2989408 ,实际上我的意思是更多。它应该拉到 x 或... x+1 或.... x+2 的位置 不确定如何通过删除该条件来获得更多行...这是左连接,此查询的行数应该与客户表中的行数相同(或者更多,如果你每行有多个匹配项)......不少于。尝试从客户中运行 select count(),然后从查询中运行 count()...它们是一样的吗? 【参考方案1】:

这与 SQL 查询中的 LEFT JOIN 有关。如果它是 INNER JOIN,那么您的期望是正确的。在 LEFT JOIN(或 RIGHT JOIN)的情况下,首先应用连接条件,然后完成连接。因此,左表上的每个谓词(即使它是带有多个 OR 谓词的 AND)实际上会减少用于最终左连接的行数。 [reference].

【讨论】:

所以你说因为月份标准被应用于主表而不是外部连接表......这导致它减少了行。如果我去掉条件,即它是一个外部连接,现在允许这些相同的记录进入? 嗯,我可能已经过火了。我的回答与应用谓词的位置有关:在 FROM 子句或 WHERE 子句中。在您展示的示例中显然不是这种情况。 我的猜测是 OR 语句过滤了两个表中都存在的 1 : M 关系。 Customer_Info 有许多行指向同一个客户行。我觉得奇怪的是,如果您删除单个 OR 语句, 1 : M 已经出现。您能否更新您的问题并显示您正在使用的 SELECT 子句?也许您可以发布一些删除 OR 语句时出现的记录?

以上是关于具有多个或条件的sql server外连接的主要内容,如果未能解决你的问题,请参考以下文章

什么是左外连接 SQLserver

详解SQL Server连接(内连接外连接交叉连接)

MSSQL 详解SQL Server连接(内连接外连接交叉连接)

LINQ:具有多个条件的左外连接

sql server链接查询

SQL Server之连接