SQL - 选择仅满足特定条件的记录组

时间:2015-02-24 19:56:04

标签: sql oracle

我正在试图弄清楚如何编写查询来选择一组只有某个条件为真的记录。这是一个例子。我有一张桌子,上面有船只和船主的清单。当船被出售给新的所有者时,会插入一条新记录,并且CURRENTOWNER标志会变为Y:

OWNERID   BOATID    CURRENTOWNER
------   --------   ------------
OWN1       NUM1          Y
OWN2       NUM1          N
OWN3       NUM1          N
OWN4       NUM2          N
OWN5       NUM2          N
OWN6       NUM2          N
OWN7       NUM3          Y

我正在尝试编写查询,只显示具有多个所有者的BOATID(例如NUM1或NUM2),并且也没有当前所有者,这意味着对于那个特定的BOATID,没有CURRENTOWNER ='的记录Y”。根据上面的数据,查询应返回NUM2,因为它没有当前所有者。

我知道我可以获得多个拥有者使用的船只清单:

select boatid from boattable group by boatid having count(*) >1

之后我不确定如何只获取没有当前所有者的记录。

2 个答案:

答案 0 :(得分:5)

您可以使用条件聚合和having子句来执行此操作:

select boatid
from boattable
group by boatid
having count(*) > 1 and
       sum(case when current_owner = 'Y' then 1 else 0 end) = 0;

这会检查是否有多个所有者,而其中没有所有者是最新的。

注意:根据您的数据结构,您可以写:

having count(*) > 1 and max(current_owner) = 'N'

但是,我认为第一个版本在意图上更清晰,如果current_owner列中出现新值,则不易出错。

答案 1 :(得分:3)

这应该这样做:

select 
  BOATID
from 
  boattable b
where 
  not exists (
    select 1 from boattable b2
    where b2.BOATID = b.BOATID and b2.CURRENTOWNER = 'Y')
group by
  BOATID
having
  count(*) > 1