具有多个或条件的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外连接的主要内容,如果未能解决你的问题,请参考以下文章