SQL нравится, но не нравится - PullRequest
0 голосов
/ 02 мая 2020

В настоящее время возникают некоторые проблемы с моим сценарием.

Вопрос звучит так: «Показать все автомобили, которые участвовали в событии 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

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Одним из методов является агрегация, но для этого необходимо указать список столбцов, которые вы хотите отобразить, из таблицы 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
    )
1 голос
/ 02 мая 2020

В одном варианте используется агрегация:

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.

никаких событий не произошло.
...