【问题标题】:SQL like but not likeSQL 喜欢但不喜欢
【发布时间】:2020-05-02 12:32:13
【问题描述】:

目前我的脚本有一些问题。

问题是这样的“显示所有参加了活动 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

【问题讨论】:

    标签: sql sql-server tsql join


    【解决方案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
        )
    

    【讨论】:

      【解决方案2】:

      一个选项使用聚合:

      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 上没有发生任何事件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-27
        • 2022-08-03
        • 2022-12-13
        • 2017-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多