我正在试图弄清楚如何编写查询来选择一组只有某个条件为真的记录。这是一个例子。我有一张桌子,上面有船只和船主的清单。当船被出售给新的所有者时,会插入一条新记录,并且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
之后我不确定如何只获取没有当前所有者的记录。
答案 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