SQL-左连接替换不在

时间:2015-07-07 17:19:53

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


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

def generate_population(N, genomelength):
    x = []
    for i in range(N):
        i = gen_individual(genomelength)
        x.append(i)

原始代码(这应该给'2'):

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

更改代码:

-- 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 

我错过了什么...... ???
请指教。
感谢。

2 个答案:

答案 0 :(得分:4)

不确定为什么要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
)

答案 1 :(得分:1)

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

1)测试连接的右侧以查看值是否为空

2)不要在联接的左侧包含过滤器

SELECT vp.ruleid 
FROM   #versions vp 
       LEFT JOIN #versions vd 
              ON vd.ruleid = vp.ruleid 
                 AND vd.isdraft = 1 
WHERE  vp.isdraft = 0 
       AND vd.ruleid IS NULL 

DEMO