Sql server 丢失行时SQL Server外部联接

Sql server 丢失行时SQL Server外部联接,sql-server,sql-server-2012,Sql Server,Sql Server 2012,根据我读到的所有信息,以下代码: SELECT v.col1, tab.col2 from view as v left outer join table as tab on v.id = tab.id and tab.value > 'some value' 应保留视图V中的所有行,同时根据“某些值”在“选项卡”上进行筛选。因此,如果视图有100行,那么输出应该有100行 但是,在我使用的SQLServer2012版本上似乎没有

根据我读到的所有信息,以下代码:

SELECT v.col1,
       tab.col2 
from   view as v left outer join table as tab 
         on v.id = tab.id
         and tab.value > 'some value'

应保留视图V中的所有行,同时根据“某些值”在“选项卡”上进行筛选。因此,如果视图有100行,那么输出应该有100行

但是,在我使用的SQLServer2012版本上似乎没有出现这种情况。on语句上添加的AND正在筛选行,即使它不应该这样做。我也尝试过使用派生表和临时表,但行不断被删除

应保留视图V中的所有行,同时启用筛选
“tab”与“some value”相对应。因此,如果视图有100行,则输出 应该有100行

这一假设似乎是错误的。请阅读本文中的“左外连接”一段:


如果右侧数据集中有多行可以合并,则可以获得比左侧数据集中更多的行。

将我的评论复制出来,以标记为每个提问者的可能解决方案:


已验证与3N1GM4相同的正确行为。向墙上扔意大利面:

您确定视图返回了那么多行,而不仅仅是查看表并期望视图显示它吗? 您最近是否对视图的基础元素进行了更改,并且需要运行sp_refreshview? 您没有显示的查询是否还有其他可能正在筛选的内容 结果如何

否则,我可以复制此行为的唯一方法是使用内部连接,而这不是您的代码所做的。正如@3N1GM4所说,您必须提供更多细节。请参阅stackoverflow.com/help/mcve


因此,如果视图有100行,那么输出应该有100行。-仅当view.id和table.id之间存在1对1的完整映射时。如果表中有多条记录具有相同的id值,那么您的查询返回的记录可能比视图中的记录多,尽管听起来您的问题正好相反,但返回的记录比视图中的记录少?您能提供一些显示问题的示例数据吗?根据您提供的详细信息,我已经尽可能地重新创建了一些近似于您的数据结构的内容,我得到了您描述的预期行为。验证了与3N1GM4相同的正确行为。在这里向墙上扔意大利面:您确定视图返回了那么多行,并且您不仅仅是在看表并期望视图显示它吗?您最近是否对视图的基础元素进行了更改,并且需要运行sp_refreshview?您没有显示的查询是否有更多内容可能会过滤结果?否则,我可以复制此行为的唯一方法是使用内部连接,而这不是您的代码所做的。正如@3N1GM4所说,您必须提供更多细节。请参阅。如果视图有100行,则根据每个视图中具有相同id的表的数量,此查询将至少得到100行。您可能会得到100多行,但至少应该得到100。@SMM-奇怪的是,经过几天令人沮丧的时间后,这个问题消失了。最接近的可能原因是您对正在更改的视图的基本元素的评论。但是,我无法确定。有没有一种方法可以将您的评论标记为已回答或其他内容?当您使用“左连接”且无法从右数据集中连接任何内容时,它将连接null,因此通过筛选选项卡。值>“某些值”至少可以删除此行。-这是正确的吗?比较在JOIN本身的ON子句中,而不是WHERE子句中,因此我认为它不应该完全排除任何行,只会导致右侧的更多记录返回NULL?@3N1GM4-您完美地解决了我的问题。比较在on子句上,但即使左表和右表之间存在匹配,左表中的行仍将被删除。左联接永远不应从左表中删除。来自wiki:表a和B的左外部联接或简单左联接的结果始终包含左表a的所有行,即使联接条件在右表B中找不到任何匹配行。@3N1GM4,右侧比较在左侧联接的ON子句中,可以只增加null值,但行数不会小于左侧数据集。我已经修好了post@vscorp1991没问题,我不认为你的答案真的回答了这个问题-他们的数据可能有一些不寻常的地方,或者其他一些因素导致他们得到的结果比他们预期的要少,但是如果没有看到一些测试数据或理想的答案,很难推测到底发生了什么。