t-sql - 左连接没有达到我的预期

标签 t-sql sql-server-2008-r2 left-join

完全困惑,我已经为此工作了 2 个小时

我认为对连接左侧的限制受到尊重

在此查询中,我得到 [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 中的所有行都会通过。只是如果 A 的某些特定行的连接失败,B 中的列可能为 NULL

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

关于t-sql - 左连接没有达到我的预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24746244/

相关文章:

sql-server - 我应该使用 EXISTS 还是 IN

xml - 如何使用 XQuery/T-SQL 解析包含嵌套默认命名空间的客户 xml

linq - 尝试将交叉连接 transact-sql 转换为 LINQ

sql-server - 我如何知道是否应该在聚集索引或堆上创建非聚集索引?

mysql - 如何 LEFT JOIN 具有相同列名的两个表

sql - 在 SQL 中查找某些行值的公共(public)行

SQL - 字符串比较忽略空格

sql - 我应该如何设置 "marital status"字段的类型?

MySQL JOIN 独立于 WHERE 子句

MYSQL:与 Group_Concatenate 一起使用的两个表上的 LEFT JOIN