SQL-选择仅满足特定条件的记录组
我正试图找出如何编写一个查询来选择一组只有特定条件为真的记录。这里有一个例子。我有一张桌子,上面有船和船主的名单。当一艘船出售给新的船主时,将插入一条新记录,CURRENTOWNER标志变为Y:SQL-选择仅满足特定条件的记录组,sql,oracle,Sql,Oracle,我正试图找出如何编写一个查询来选择一组只有特定条件为真的记录。这里有一个例子。我有一张桌子,上面有船和船主的名单。当一艘船出售给新的船主时,将插入一条新记录,CURRENTOWNER标志变为Y: OWNERID BOATID CURRENTOWNER ------ -------- ------------ OWN1 NUM1 Y OWN2 NUM1 N OWN3 NUM1 N OWN4
OWNERID BOATID CURRENTOWNER
------ -------- ------------
OWN1 NUM1 Y
OWN2 NUM1 N
OWN3 NUM1 N
OWN4 NUM2 N
OWN5 NUM2 N
OWN6 NUM2 N
OWN7 NUM3 Y
我正在尝试编写一个查询,该查询将只显示具有多个所有者(例如NUM1或NUM2)且没有当前所有者的BOATID,这意味着对于特定的BOATID,在CURRENTOWNER='Y'处没有记录。根据上面的数据,查询应该返回NUM2,因为它没有当前所有者
我知道我可以通过以下方式获得拥有多个船主的船只列表:
select boatid from boattable group by boatid having count(*) >1
之后,我不确定如何只获取没有当前所有者的记录。这应该可以做到:
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
您可以通过条件聚合和
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\u owner
列中,则不太容易出错。这非常有效。非常感谢你。我在玩一个不存在的游戏,但是我缺少的是自我连接。再次感谢。为什么您的ID中包含字符串?@GordonLinoff道歉。我更正了该段,并删除了sql server标记,因为这是在Oracle中。@Zane这只是示例数据,尽管这些字段的实际数据类型是varchar2。为了简单起见,我添加了OWN和NUM前缀。