SQL Server Outer Join ON Conditon Losing Rows

时间:2016-12-08 15:23:18

标签: 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),同时在'tab'上对'some value'进行过滤。因此,如果视图有100行,则输出应该有100行。

但是,我正在使用的sql server 2012版本似乎没有发生这种情况。 “ON”语句中添加的“AND”是过滤行,即使它不应该。我也尝试使用派生表和临时表,行不断被删除。

2 个答案:

答案 0 :(得分:0)

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

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

  1. 您确定该视图会返回多行,而您不仅仅是在看表并期望视图显示它吗?
  2. 您最近是否对视图的基础元素进行了更改并需要运行sp_refreshview?
  3. 您可能正在过滤的查询中是否还有其他内容 结果?

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

答案 1 :(得分:-2)

  

应保留视图中的所有行(V),同时进行过滤   '标签'反对某些价值'。因此,如果视图有100行,则输出   应该有100行。

这个假设看起来不对。请阅读段落'左外连接'来自这篇文章:Join on wiki

如果在右侧数据集中您有多行可以连接,则可以获得更多行,然后左侧数据集具有。