Sql 用于验证分区组中是否存在项的查询
我有一组类似于以下格式的数据 GROUP | ELEMENT --------------- 1 | A 1 | B 1 | C 2 | A 3 | B 4 | A 4 | B 5 | A 5 | C 群元素 --------------- 1 | A 1 | B 1 | C 2 | A 3 | B 4 | A 4 | B 5 | A 5摄氏度 我希望能够验证元素A和B是否存在于每个组中。理想情况下,我只返回同时包含这两个元素的组。在上面的例子中,我只想返回组1和组4 编辑:Sql 用于验证分区组中是否存在项的查询,sql,oracle,Sql,Oracle,我有一组类似于以下格式的数据 GROUP | ELEMENT --------------- 1 | A 1 | B 1 | C 2 | A 3 | B 4 | A 4 | B 5 | A 5 | C 群元素 --------------- 1 | A 1 | B 1 | C 2 | A 3 | B 4 | A 4 | B 5 | A 5摄氏度 我希望能够验证元素A和B是否存在于每个组中。
对不起,我不应该暗示“A”和“B”是唯一的选项。是否可以专门查找是否存在特定值,如“A”和“B”?可能还有其他可能的值。我已经更新了示例数据以反映这一点。不确定以下操作是否有效,但您可以尝试一下
SELECT group, COUNT(DISTINCT(element))
FROM table
group by group
having COUNT(DISTINCT(element)) = 2
我不确定
COUNT(DISTINCT(element))
是否有效 此查询将返回所有组(ID)和元素(名称),其中每个组正好有两个不同的元素。将中的条款更改为修改“恰好两个不同的元素”规则
这更像是一个
关系划分
问题,但您需要用每个元素显示每个组
查询:
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 ║
╠═══════╣
║ 1 ║
║ 4 ║
╚═══════╝
但是如果您只想返回组
,您可以在下面简单地使用它
SELECT "GROUP"
FROM TableName b
WHERE "ELEMENT" IN ('A','B')
GROUP BY "GROUP"
HAVING COUNT(*) = 2
输出
╔═══════╦═════════╗
║ GROUP ║ ELEMENT ║
╠═══════╬═════════╣
║ 1 ║ A ║
║ 1 ║ B ║
║ 1 ║ C ║
║ 4 ║ A ║
║ 4 ║ B ║
╚═══════╩═════════╝
╔═══════╗
║ GROUP ║
╠═══════╣
║ 1 ║
║ 4 ║
╚═══════╝
**id是问题中的列组,表名是堆栈
如果我们删除“ELEMENT IN”条件,我们将能够获得包含多个元素的所有组它返回的组仅包含元素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')
你能出示你的原始数据吗?对不起,我不应该暗示数据是另一种格式的。这表示从简单选择返回的原始数据的子集。+1。是的,虽然不需要元素周围的括号,但这会起作用。例如,如果有两个条目并且都包含一个“a”元素,那么不简单地进行计数(*)也会返回一个结果吗?正如我指出的,我希望确保这两个元素都包括在内。