【问题标题】:Find all IDs which have a row with value A AND a row with value B查找具有值为 A 的行和值为 B 的行的所有 ID
【发布时间】:2017-11-30 19:16:19
【问题描述】:

我有一张这样的桌子:

+-----+-------+-----+
| id  | value | ... |
+-----+-------+-----+
| 1   | A     | ... |
| 1   | B     | ... |
| 1   | C     | ... |
| 2   | B     | ... |
| 2   | C     | ... |
| 3   | A     | ... |
| 3   | C     | ... |
| 4   | B     | ... |
| 4   | A     | ... |
| ... | ...   | ... |
+-----+-------+-----+

我想将此限制为仅在 value 列中同时具有 A 行和 B 行的 ids。在这种情况下,表格如下所示:

+-----+-------+-----+
| id  | value | ... |
+-----+-------+-----+
| 1   | A     | ... |
| 1   | B     | ... |
| 1   | C     | ... |
| 4   | B     | ... |
| 4   | A     | ... |
| ... | ...   | ... |
+-----+-------+-----+

...因为id 2 和 3 在value 列中都没有 A 和 B。

有没有一种简洁的方法可以找到这些 ID?

【问题讨论】:

    标签: sql postgresql select


    【解决方案1】:
    select id, value
    from t
    where id in (
        select id
        from t
        group by id
        having bool_or(value = 'A') and bool_or(value = 'B')
    )
    

    或

    select id, value
    from t t0
    where 
        exists (
            select 1
            from t
            where id = t0.id and value = 'A'
        ) and
        exists (
            select 1
            from t
            where id = t0.id and value = 'B'
        ) 
    

    【讨论】:

      【解决方案2】:

      一种方法是计算一个 id 具有的 a/bs 的不同数量:

      SELECT *
      FROM   mytable
      WHERE  id IN (SELECT   id
                    FROM     mytable
                    WHERE    value in ('a', 'b')
                    GROUP BY id
                    HAVING   COUNT(DISTINCT value) = 2)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-17
        • 1970-01-01
        • 2020-03-25
        • 1970-01-01
        • 2015-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多