【问题标题】:How to write a Query that should return me foreign key only if it satisfy all the conditions如何编写一个仅在满足所有条件时才返回我外键的查询
【发布时间】:2013-12-16 15:31:02
【问题描述】:

我有父表 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

现在我的问题是我想对子表进行查询,并且只想找出所有状态都相同且状态应该只打开的 SID。

注意:在上面的例子中,我应该只有很少的针对 SID 的状态,但是有多个状态。并且每次我都希望针对不同的状态进行此查询。

预期结果: 如果我暂时将状态视为打开状态,那么只有 SID 2 存在,它具有所有打开状态的记录。

【问题讨论】:

    标签: sql sql-server-2005 sql-server-2008-r2


    【解决方案1】:

    您可以使用聚合和having 子句来做到这一点。以下工作假设 status 永远不是 NULL

    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';
    

    【讨论】:

    • 我将通过 min(status) 得到什么。那是 char 字段。
    • @BharatGurbani 。 . .您将使用列/数据库/服务器的排序规则指定的顺序获得最小值。这通常是按字母顺序排列的第一个。
    【解决方案2】:

    是的,就像 Gordon 说的你需要使用聚合,你也可以使用 count:

    SELECT sid
    from b
    Group by sid
    having count(Distinct status)=1 and min(status)='open'
    

    min(status) 将为您提供第一个字母解决方案。

    【讨论】:

    • 请解释一下 min(status) 会吸引我
    • min(status) 将为您提供第一个字母解决方案。
    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2018-01-22
    相关资源
    最近更新 更多