Tsql Left Join没有达到我的预期

Tsql Left Join没有达到我的预期,tsql,sql-server-2008-r2,left-join,Tsql,Sql Server 2008 R2,Left Join,完全糊涂了,我已经为此工作了两个小时 我认为连接左侧的限制是值得尊重的 在这个查询中,我得到[docSVsys].[visibility]1和1 我认为这会将[docSVsys][visibility]限制为1 select top 1000 [docSVsys].[sID], [docSVsys].[visibility] ,[Table].[sID],[Table].[enumID],[Table].[valueID] from [docSVsys] w

完全糊涂了,我已经为此工作了两个小时

我认为连接左侧的限制是值得尊重的

在这个查询中,我得到[docSVsys].[visibility]1和1
我认为这会将[docSVsys][visibility]限制为1

select top 1000 
       [docSVsys].[sID], [docSVsys].[visibility] 
      ,[Table].[sID],[Table].[enumID],[Table].[valueID] 
  from [docSVsys]  with (nolock) 
  left Join [DocMVenum1] as [Table] with (nolock) 
    on [docSVsys].[visibility] in (1)
   and [Table].[sID] = [docSVsys].[sID]
   and [Table].[enumID] = '140' 
   and [Table].[valueID] in (1,7) 
这很有效

select top 1000 
       [docSVsys].[sID], [docSVsys].[visibility] 
      ,[Table].[sID],[Table].[enumID],[Table].[valueID] 
  from [docSVsys]  with (nolock) 
  left Join [DocMVenum1] as [Table] with (nolock) 
    on [Table].[sID] = [docSVsys].[sID]
   and [Table].[enumID] = '140' 
   and [Table].[valueID] in (1,7)
 where [docSVsys].[visibility] in (1)
我刚刚度过了一个非常不愉快的一天,因为在我的脑海中,左派很荣幸加入

SELECT *
FROM A
LEFT JOIN B ON Condition
相当于

 SELECT *
 FROM A
 CROSS JOIN B
 WHERE Condition
UNION ALL
 SELECT A.*, NULL AS B
 FROM A
 WHERE NOT EXISTS (SELECT * FROM B WHERE Condition)
一些粗略的伪代码

请注意,一个表中的所有行都可以通过。只是如果对
A
的某个特定行的连接失败,
B
中的列可以是
NULL


docSVsys
上的过滤器放入
WHERE
子句中。

左连接保留左(第一)表中的所有行,无论发生什么情况。ON子句中的条件仅用于匹配右/第二个表中的哪些行应与左/第一个表中的行配对

如果要从firs表中排除某些行,请使用WHERE子句:

select top 1000 
   [docSVsys].[sID], [docSVsys].[visibility] 
  ,[Table].[sID],[Table].[enumID],[Table].[valueID] 
from [docSVsys]  with (nolock) 
left Join [DocMVenum1] as [Table] with (nolock) 
  on [Table].[sID] = [docSVsys].[sID]
  and [Table].[enumID] = '140' 
  and [Table].[valueID] in (1,7) 
where [docSVsys].[visibility] in (1)

否。您的限制仅适用于加入。您需要将
[docSVsys].[visibility]放入(1)
中的
位置
,以避免在结果中看到
[docSVsys].[visibility]1
所在的行。您当前的所有条件确保它们不会加入
DocMVenum1
中的一行,因此将在这些列中保留为不匹配和空扩展。@MartinSmith是新手,并且非常基本,如果您将其放在回答中,我将接受它。您可以使用
内部加入
。我在移动设备上,因此不会发帖完整答案。不管怎么说,Usr现在发布了一个@TimSchmelter——这取决于连接中涉及的其他三列所需的语义是什么。这在文档中非常重要,并且在很长一段时间内都是正确的。不知道今天我脑子里想的是什么。