SQL-要替换的左联接不在

SQL-要替换的左联接不在,sql,sql-server-2008,sql-server-2005,Sql,Sql Server 2008,Sql Server 2005,我正在尝试使用左连接替换NOT IN,但由于某些原因无法获得所需的结果。 这是原始查询 create table #versions ( Ruleid int, IsDraft INT ) -- prod #versions insert into #versions values (1, 0) insert into #versions values (2, 0) -- this will be deleted -- Draft version insert into #versi

我正在尝试使用左连接替换NOT IN,但由于某些原因无法获得所需的结果。 这是原始查询

create table #versions
(
    Ruleid int, IsDraft INT
)

-- prod #versions
insert into #versions values (1, 0)
insert into #versions values (2, 0) -- this will be deleted

-- Draft version
insert into #versions values (1, 1) -- changed added
原始代码应给出“2”:

-- Getting all the rules that are deleted

    select distinct vp.ruleid from #versions vp where vp.IsDraft = 0
    except 
    select distinct vd.ruleid from #versions vd where vd.IsDraft = 1 
更改代码:

select vp.RuleId from #versions vp 
LEFT JOIN #versions vd 
ON vd.RuleId = vp.RuleId and vp.IsDraft = 0 and vd.IsDraft = 1
我是不是遗漏了什么。。。???
请给我一些建议。谢谢。

不确定您为什么想要左加入。我认为“不存在”在这种情况下更合适,假设我理解你想做什么。实际上,您没有指定所需的结果,因此我假设您希望重现先前查询的结果

SELECT DISTINCT vp.RuleId
FROM #versions vp
WHERE vp.IsDraft = 0
AND NOT EXISTS (
  SELECT null
  FROM #versions vd
  WHERE vd.RuleId = vp.RuleId
  AND vd.IsDraft = 1
)

不知道你为什么想要左连接。我认为“不存在”在这种情况下更合适,假设我理解你想做什么。实际上,您没有指定所需的结果,因此我假设您希望重现先前查询的结果

SELECT DISTINCT vp.RuleId
FROM #versions vp
WHERE vp.IsDraft = 0
AND NOT EXISTS (
  SELECT null
  FROM #versions vd
  WHERE vd.RuleId = vp.RuleId
  AND vd.IsDraft = 1
)

如果你真的想使用和反加入,你需要做两件事

测试联接的右侧以查看值是否为null

不要在联接的左侧包含筛选器

选择vp.ruleid 来自版本vp 左连接版本 在vd.ruleid=vp.ruleid上 和vd.isdraft=1 其中vp.isdraft=0 并且vd.ruleid为空


如果你真的想使用和反加入,你需要做两件事

测试联接的右侧以查看值是否为null

不要在联接的左侧包含筛选器

选择vp.ruleid 来自版本vp 左连接版本 在vd.ruleid=vp.ruleid上 和vd.isdraft=1 其中vp.isdraft=0 并且vd.ruleid为空


为什么要更改查询?您之前的查询有什么问题?不在的地方在哪里?为什么要使用左联接?为什么要更改查询?您之前的查询有什么问题?不在的地方在哪里?为什么要使用左连接?谢谢@dotjoe的编辑:完全错过了。谢谢@dotjoe的编辑:完全错过了。