SQL- 左连接替换不在
SQL- Left Join to Replace Not in
我正在尝试使用 LEFT JOIN 替换 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
我是不是漏掉了什么...???
请指教。
谢谢。
不确定您为什么想要 LEFT JOIN
。我认为 NOT EXISTS
在这种情况下更合适,假设我了解您要做什么。您实际上并没有指定您想要的结果,所以我假设您想要从您之前的查询中重现结果。
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
)
如果你真的想使用 ANTI -JOIN 你需要做两件事
测试联接的右侧以查看值是否为空
不要在联接左侧包含过滤器
SELECT vp.ruleid
来自#versions vp
左连接 #versions vd
ON vd.ruleid = vp.ruleid
和 vd.isdraft = 1
其中 vp.isdraft = 0
并且 vd.ruleid 为 NULL
我正在尝试使用 LEFT JOIN 替换 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
我是不是漏掉了什么...???
请指教。
谢谢。
不确定您为什么想要 LEFT JOIN
。我认为 NOT EXISTS
在这种情况下更合适,假设我了解您要做什么。您实际上并没有指定您想要的结果,所以我假设您想要从您之前的查询中重现结果。
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
)
如果你真的想使用 ANTI -JOIN 你需要做两件事
测试联接的右侧以查看值是否为空
不要在联接左侧包含过滤器
SELECT vp.ruleid 来自#versions vp 左连接 #versions vd ON vd.ruleid = vp.ruleid 和 vd.isdraft = 1 其中 vp.isdraft = 0 并且 vd.ruleid 为 NULL