查找符合特定条件的记录组

时间:2010-11-10 17:59:21

标签: sql sql-server tsql sql-server-2008

我有以下数据:

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”的记录。

非常感谢任何帮助!

5 个答案:

答案 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的索引)