查询以验证分区组中是否存在项目

时间:2013-06-03 15:27:44

标签: sql oracle

我有一组类似于以下格式的数据。

GROUP | ELEMENT
---------------
  1   |   A
  1   |   B
  1   |   C
  2   |   A
  3   |   B
  4   |   A
  4   |   B
  5   |   A
  5   |   C

我希望能够验证每个组中是否存在元素A和B.理想情况下,我只返回那些具有两个元素的组。在上面的例子中,我想只返回GROUP 1和GROUP 4。

编辑:
对不起,我不应该暗示'A'和'B'是唯一的选择。是否可以专门查看特定值的存在,例如“A”和“B”?可能还有其他可能的值。我已更新示例数据以反映这一点。

5 个答案:

答案 0 :(得分:3)

不确定以下是否有效,但您可以尝试

SELECT group, COUNT(DISTINCT(element))
FROM table
group by group
having COUNT(DISTINCT(element)) = 2

我不确定COUNT(DISTINCT(element))是否有效!

答案 1 :(得分:3)

这更多是Relational Division问题,但您需要为每个GROUP显示每个Element

查询:

SELECT  a.*
FROM    TableName a
WHERE   EXISTS
        (
            SELECT  1
            FROM    TableName b
            WHERE   a."GROUP" = b."GROUP" AND
                    b."ELEMENT" IN ('A','B')
            GROUP   BY b."GROUP"
            HAVING  COUNT(*) = 2
        )

输出

╔═══════╦═════════╗
║ GROUP ║ ELEMENT ║
╠═══════╬═════════╣
║     1 ║ A       ║
║     1 ║ B       ║
║     1 ║ C       ║
║     4 ║ A       ║
║     4 ║ B       ║
╚═══════╩═════════╝

但如果您只想返回GROUP,则只需使用下面的

即可
SELECT  "GROUP"
FROM    TableName b
WHERE   "ELEMENT" IN ('A','B')
GROUP   BY "GROUP"
HAVING  COUNT(*) = 2

输出

╔═══════╗
║ GROUP ║
╠═══════╣
║     1 ║
║     4 ║
╚═══════╝

答案 2 :(得分:1)

此查询将返回所有GROUP(ID)和ELEMENT(名称),其中每个GROUP恰好有2个不同的元素。更改HAVING子句以修改“完全相同的2个ELEMENTS”规则。

SELECT GROUP, ELEMENT 
FROM MyTable
WHERE GROUP in 
    (SELECT GROUP from MyTable
     GROUP BY GROUP 
     HAVING COUNT (DISTINCT ELEMENT)=2
     )

答案 3 :(得分:0)

> SELECT ID,
>        ELEMENT FROM STACK WHERE ID IN
>     (SELECT ID
>      FROM
>        (SELECT id AS ID,
>                COUNT(DISTINCT(element)) AS B
>         FROM STACK
>         WHERE ELEMENT IN ('A',
>                           'B')
>         GROUP BY id HAVING COUNT(DISTINCT(element)) >1)A)   AND ELEMENT IN ('A',
>                   'B');

** ID 是问题中的 名称是堆栈< /强>

如果我们删除“ELEMENT IN”条件,我们将能够获得所有拥有多个元素的组

答案 4 :(得分:0)

它返回的组只有元素A和B

SELECT a.*
FROM Table a
WHERE EXISTS
(
    SELECT 1
    FROM Table b
    WHERE a.group = b.group
    GROUP BY b.group
   HAVING COUNT(distinct element) = 2
)
and a.element IN ('A','B')