SQL - 如何在 Group By 后避免一些记录

SQL - How to avoid some records after a Group By

内部联接和分组依据之后,我得到以下输出:

Make, Model
Ferrari, A
Ferrari, B
Aston, A
Opel, A

我的问题是.. 如何从查询输出中忽略 make Ferrari 的记录,因为它在第二个 table (models) 中包含多个模型?

PS:第二个table可能包含多个记录,即使是同一型号。

我不想只忽略法拉利。我想忽略相同情况下的所有品牌(table 两个中有超过 1 个模型)。

当前查询:

select c.Make, m.Model
from cars as c
inner join models as m on c.make = m.make
where c.year = '2017'
group by c.Make, m.Model

使用not exists()

select c.Make, m.Model
from cars as c
  inner join models as m 
    on c.make = m.make
where c.year = '2017'
  and not exists (
    select 1
    from cars as i
    where i.Make = c.Make
      and i.Model <> c.Model)
)
group by c.Make, m.Model

您可以将 havingcount(distinct c.Model))=1 一起用于只有 return 具有单一模型的人。

select c.Make, m.Model
from cars as c
  inner join models as m 
    on c.make = m.make
where c.year = '2017'
group by c.Make, m.Model
having count(distinct c.Model)=1

试试这个...

select c.Make, m.Model
from cars as c
inner join models as m on c.make = m.make
where c.year = '2017' and c.make != 'Ferrari'
group by c.Make, m.Model

您需要执行某种聚合来计算每个品牌的模型数量。如果您使用的 DBMS 支持 window 函数,那么您可以使用它们来完成这项工作:

select c.make, m.model
from cars as c
  inner join (
    select make, model, count(*) over (partition by make) as model_count
    from model
  ) m
    on c.make = m.make
where c.year = '2017' and m.model_count = 1

您不再需要使其成为聚合查询(通过使用 GROUP BY 子句),只要 (c.make, c.year) 可以被认为是唯一的,对于过滤条件,然后将确保没有 make 出现超过一次。然而,为了正确性,这确实依赖于 (model.make, model.model) 是唯一的。

注意:我假设您正在执行您真正想要执行的连接。既然你没有提供 table 结构,我就没有别的办法了。但是,我怀疑这可能不是您真正想要执行的连接。特别是,我想知道您是否真的想要有关哪个品牌在指定年份 只生产了一个型号 的信息,如果是这样,那么看起来您需要进行更深入的更改才能实现这一目标.