当前我的脚本有一些问题。
问题是这样的:“显示所有参加了事件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
答案 0 :(得分:1)
一个选项使用聚合:
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
没有发生任何事件。
答案 1 :(得分:1)
一种方法是聚合-但这要求您列出要从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
否则,您也可以使用exists
和not exists
。这种输入的时间更长,但其效果可能比group by
/ having
解决方案更好,甚至更好:
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
)