SQL喜欢但不喜欢

SQL喜欢但不喜欢,sql,sql-server,tsql,join,Sql,Sql Server,Tsql,Join,目前我的脚本有一些问题 问题是这样的“显示所有参加201504活动但未参加201504活动的车辆”。因此,如果它们未参与事件01,则不应显示它们。他们现在是这样做的 我提出了以下问题,但无法进一步了解 select * from autos a join deelnemers d on a.autonr = d.autonr join evenementen e on d.evenementnr = e.evenementnr where e.evenementnr = '201504'

目前我的脚本有一些问题

问题是这样的“显示所有参加201504活动但未参加201504活动的车辆”。因此,如果它们未参与事件01,则不应显示它们。他们现在是这样做的

我提出了以下问题,但无法进一步了解

select *
from autos a
join deelnemers d on a.autonr = d.autonr
join evenementen e on d.evenementnr = e.evenementnr
where e.evenementnr = '201504'
    and e.evenementnr != '201501'                               
order by bouwjaar desc

一个选项使用聚合:

select a.bouwjaar
from autos a
join deelnemers d on a.autonr = d.autonr
join evenementen e on d.evenementnr = e.evenementnr
group by a.bouwjaar
having
    count(case when e.evenementnr  = '201504' then 1 end) > 0 and
    count(case when e.evenementnr != '201501' then 1 end) = 0                           
order by a.bouwjaar desc;

的想法是在聚合模式下运行查询,考虑属于给定汽车的每一组记录。然后,我们在

HAVING
子句中断言在
201504
上至少发生了一个事件,同时还断言在
201501
上没有发生任何事件一个选项使用聚合:

select a.bouwjaar
from autos a
join deelnemers d on a.autonr = d.autonr
join evenementen e on d.evenementnr = e.evenementnr
group by a.bouwjaar
having
    count(case when e.evenementnr  = '201504' then 1 end) > 0 and
    count(case when e.evenementnr != '201501' then 1 end) = 0                           
order by a.bouwjaar desc;

的想法是在聚合模式下运行查询,考虑属于给定汽车的每一组记录。然后,我们在

HAVING
子句中断言在
201504
上至少发生了一个事件,同时还断言在
201501
上没有发生任何事件。一种方法是聚合-但这要求您列出要从
autos
表中显示的列:

select a.id, a.name
from autos a
inner join deelnemers d on a.autonr = d.autonr
inner join evenementen e on d.evenementnr = e.evenementnr
where e.evenementnr in (201504, 201501)
group by a.id, a.name
having 
    max(case when e.evenementnr = 201504 then 1 else 0 end) = 1
    and max(case when e.evenementnr = 201501 then 1 else 0 end) = 0
否则,您也可以使用
存在
不存在
。这比键入时间长,但可能表现得同样好,或者比具有解决方案的
group by
/
更好:

select a.*
from autos a
where 
    exists (
        select 1
        from deelnemers d
        inner join evenementen e on d.evenementnr = e.evenementnr
        where a.autonr = d.autonr and e.evenementnr = 201504
    )
    and not exists (
        select 1
        from deelnemers d
        inner join evenementen e on d.evenementnr = e.evenementnr
        where a.autonr = d.autonr and e.evenementnr = 201501
    )

一种方法是聚合-但这要求您从
autos
表中列出要显示的列:

select a.id, a.name
from autos a
inner join deelnemers d on a.autonr = d.autonr
inner join evenementen e on d.evenementnr = e.evenementnr
where e.evenementnr in (201504, 201501)
group by a.id, a.name
having 
    max(case when e.evenementnr = 201504 then 1 else 0 end) = 1
    and max(case when e.evenementnr = 201501 then 1 else 0 end) = 0
否则,您也可以使用
存在
不存在
。这比键入时间长,但可能表现得同样好,或者比具有
解决方案的
group by
/
更好:

select a.*
from autos a
where 
    exists (
        select 1
        from deelnemers d
        inner join evenementen e on d.evenementnr = e.evenementnr
        where a.autonr = d.autonr and e.evenementnr = 201504
    )
    and not exists (
        select 1
        from deelnemers d
        inner join evenementen e on d.evenementnr = e.evenementnr
        where a.autonr = d.autonr and e.evenementnr = 201501
    )