Найти группу записей, соответствующих определенным критериям - PullRequest
1 голос
/ 10 ноября 2010

У меня есть следующие данные:

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 содержат хотя бы одну запись, в которой в качестве значения данных указано «А», я бы не хотел их видеть.Я хотел бы видеть только записи 4 и 5 (которые являются частью группы 4), поскольку в этой группе нет записей с буквой "А".

Любая помощь приветствуется!

Ответы [ 5 ]

5 голосов
/ 10 ноября 2010
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), если таблица большая.

2 голосов
/ 10 ноября 2010

Это должно сделать

SELECT
  *
FROM
  yourtable
WHERE
  parentID NOT IN (SELECT DISTINCT parentID FROM yourtable WHERE DataValue = 'A')
1 голос
/ 10 ноября 2010

Однопроходное решение:

select ParentID
from YourTable
group by ParentID
having sum(case DataValue when 'A' then 1 else 0 end) = 0
0 голосов
/ 12 ноября 2010

Мне нравится ответ Томалака, но я почему-то скептически отношусь к тому, что он выполнит NOT EXISTS для каждой строки в таблице, а не для каждого отдельного ParentId, поэтому, когда группы большие, он будет медленнее, чем необходимо.

В этом случае ответ Габи будет лучше, в сочетании с индексом 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)

0 голосов
/ 10 ноября 2010

Это работает?Вы не говорите, находятся ли все данные в одной таблице или нет.

select parentid from yourtable
where groupid IN ( select DISTINCT groupid from yourtable where datavalue = 'A' )
group by parentid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...