Sql 如何编写只在满足所有条件时才返回外键的查询
我将父表A作为Sql 如何编写只在满足所有条件时才返回外键的查询,sql,sql-server-2005,sql-server-2008-r2,Sql,Sql Server 2005,Sql Server 2008 R2,我将父表A作为 **SID name** 1 ABC 2 XYZ 3 ZYK ......... 和子表B作为 SID Status 1 New 1 Open 1 Closed 2 Open 2 Open 3 New 3 Open 3 Closed 3 REJ 现在我的问题是,我想对子表进行查询,只想找出所有状态都相同且状态应仅为open的SID 注意:在上面的示例中,我应该只有几个状态与SID相对,但是有多个状态。每次我想查询不同
**SID name**
1 ABC
2 XYZ
3 ZYK
.........
和子表B作为
SID Status
1 New
1 Open
1 Closed
2 Open
2 Open
3 New
3 Open
3 Closed
3 REJ
现在我的问题是,我想对子表进行查询,只想找出所有状态都相同且状态应仅为open的SID
注意:在上面的示例中,我应该只有几个状态与SID相对,但是有多个状态。每次我想查询不同的状态
预期结果:
暂时,如果我将状态视为打开,那么SID 2只有在那里有所有打开状态的记录。p> 您可以通过聚合和
having
子句来实现这一点。假设状态
从不为空
,则以下操作有效:
select sid
from b
group by sid
having min(status) = max(status) and
min(status) = 'open';
如果有NULL
值,可以使用此having
子句:
having count(*) = count(status) and
min(status) = max(status) and
min(status) = 'open';
是的,就像Gordon说的,你需要使用聚合,你也可以使用计数:
SELECT sid
from b
Group by sid
having count(Distinct status)=1 and min(status)='open'
min(状态)将为您提供第一个按字母顺序排列的解决方案。我将通过min(状态)获得什么。那是查尔·菲尔德。@Bharagurbani。您将使用列/数据库/服务器排序规则指定的顺序获得最小值。这通常是按字母顺序排列的第一个。请解释min(status)将获取什么方法min(status)将获取第一个字母顺序的解决方案。