【问题标题】:SQL- Left Join to Replace Not inSQL-左连接替换不在
【发布时间】:2015-07-07 17:19:52
【问题描述】:


我正在尝试使用 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

我是不是错过了什么……???
请指教。
谢谢。

【问题讨论】:

  • 为什么要更改查询?您之前的查询有什么问题? NOT IN 在哪里?为什么要使用LEFT JOIN

标签: sql sql-server-2008 sql-server-2005


【解决方案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
)

【讨论】:

  • 感谢@dotjoe 的编辑 :) 完全错过了。
【解决方案2】:

如果你真的想使用和 ANTI -JOIN 你需要做两件事

  1. 测试连接的右侧,看看值是否为空

  2. 不要在连接的左侧包含过滤器

    选择 vp.ruleid 来自#versions vp 左连接#versions vd ON vd.ruleid = vp.ruleid 和 vd.isdraft = 1 在哪里 vp.isdraft = 0 并且 vd.ruleid 为空

DEMO

【讨论】:

    猜你喜欢
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2016-10-02
    • 1970-01-01
    相关资源
    最近更新 更多