我有以下数据:
ID --- ParentID --- DataValue
1 --- 1 --- A
2 --- 1 --- B
3 --- 1 --- C
4 --- 4 --- B
5 --- 4 --- C
6 --- 6 --- A
7 --- 6 --- B
8 --- 6 --- C
9 --- 6 --- D
对于每组记录(按ParentID分组),我希望找到所有没有包含“A”的记录作为DataValue的组
由于组1和组6至少包含一个“A”作为DataValue的记录,我不希望看到它们。我只想看到记录4和5(这是第4组的一部分),因为该组中没有记录有“A”的记录。
非常感谢任何帮助!
答案 0 :(得分:5)
SELECT
ID,
ParentID,
DataValue
FROM
MyTable
WHERE
NOT EXISTS (
SELECT 1
FROM MyTable i
WHERE i.ParentId = MyTable.ParentId AND i.DataValue = 'A'
)
如果表格很大,建议使用(ParentId, DataValue)
以上的索引。
答案 1 :(得分:2)
这应该
SELECT
*
FROM
yourtable
WHERE
parentID NOT IN (SELECT DISTINCT parentID FROM yourtable WHERE DataValue = 'A')
答案 2 :(得分:1)
单程解决方案:
select ParentID
from YourTable
group by ParentID
having sum(case DataValue when 'A' then 1 else 0 end) = 0
答案 3 :(得分:0)
这有用吗?您没有说明所有数据是否都在一个表中。
select parentid from yourtable
where groupid IN ( select DISTINCT groupid from yourtable where datavalue = 'A' )
group by parentid
答案 4 :(得分:0)
我喜欢Tomalak的答案,但我对它会对表中的每一行执行NOT EXISTS
而不是每个不同的ParentId持怀疑态度,因此当组很大时,它会比必要的慢
在这种情况下,Gaby的答案会更好,再加上DataValue的索引和ParentId的索引。
只是为了好玩,怎么样:
SELECT R.Id, R.ParentId, R.DataValue FROM (
SELECT DISTINCT ParentId FROM YourTable
EXCEPT SELECT DISTINCT ParentId FROM YourTable WHERE DataValue = 'A'
) L
LEFT JOIN YourTable R ON R.ParentId = L.ParentId
(还有一个关于DataValue的索引和一个关于ParentId的索引)