可以将“ WHERE NOT EXISTS”子句与其他WHERE条件一起使用吗

时间:2018-09-25 09:31:43

标签: sql

我想检查另一组中是否存在一组ID。

如果其中之一的查询是:

select distinct p.personID

from log L
 left join person p ON l.tableID = p.personid

where
     l.tablename like 'person'
 and l.date between '2018-01-01' and '2018-02-01'
 and (l.type like 'insert' or l.type like 'update')

group by p.personid

,另一个是

select distinct p.personID

from log L
 left join person p ON l.tableID = p.personid

where
     l.tablename like 'person'
 and l.date > '2018-02-01'

group by p.personid

所以这个“不存在”似乎是我所需要的,但似乎不适用于where条件。因此,有没有办法让我在查询中执行此检查,而不是使用Excel vlookup。

编辑:确定,所以我知道“ NOT EXISTS”不是我所需要的。 示例结果将是: 设置返回值:1、2、3、4、5 设置两个返回值:1,4,6,7,8,9,10 我想最后得到的结果是2,3,5。结果出现在第一个查询中,而不出现在第二个查询中,这就是为什么我认为不存在可能是我需要的原因。

3 个答案:

答案 0 :(得分:1)

您可以在第一个查询的where子句中使用p.personid not in (other select query)

答案 1 :(得分:0)

如果您使用的是like,则对查询的更改很小,如果不使用运算符'%',则使用'='(这在某种程度上是LIKE的一种特殊情况)

如果您已经使用了distinct,则不必使用GROUP BY, 不管哪种情况都行,在您的查询中优先使用distinct

select distinct p.personID

from log L
 left join person p ON l.tableID = p.personid

where
     l.tablename like '%person%'
 and l.date between '2018-01-01' and '2018-02-01'
 and (l.type like '%insert%' or l.type like '%update%')

答案 2 :(得分:0)

因此,您希望满足第一个条件但不满足第二个条件的人。

首先,假设您的数据库合理,则不需要join

第二,一种方法使用group by

select l.tableID
from log l
where l.tablename = 'person' and
      l.date >= '2018-01-01'
group by l.tableID
having sum(case when l.date >= '2018-01-01' and
                     l.date < '2018-02-01' and
                     l.type in ('insert', 'update')
                then 1 else 0
           end) > 0 and
          sum(case when l.date >= '2018-02-01'
                   then 1 else 0
              end) = 0;