2015-07-29 4 views
0

Я ищу решение для этого (MS SQL 2008, кстати):SQL для идентификации дубликатов в древовидной структуре

ID | ParentID | Feature_1 | Feature_2 +-----+------------+------------+----------+ 1 | NULL | A | B 2 | 1 | A | B 3 | 1 | A | C 4 | 2 | A | C

Всякий раз, когда ребенок (запись с ParentID) имеет тот же набор функций (Feature_1 и Feature_2), что и его родительский элемент, я хочу игнорировать его, по сути, не показывать его в моем select *.

Таким образом, результирующий набор должен быть

ID | ParentID | Feature_1 | Feature_2 +-----+------------+------------+----------+ 1 | NULL | A | B 3 | 1 | A | C 4 | 2 | A | C

Обратите внимание, что ID = 2 отбрасывается, но ID = 4 отображается, поскольку он имеет различный набор функций, чем его родитель.

Любая помощь была бы высоко оценена!

+0

Спасибо, ребята, но я дал плохой пример. Родитель может иметь несколько записей, а также своих детей. Все они должны быть проверены на наличие дубликатов или по существу сгруппированы, поэтому я вижу только уникальные комбинации функций для родителя и всего его прямого дочернего элемента (независимо от количества записей). Так эффективно мне нужно сравнивать наборы. – fexx

+0

Тогда в вашем примере вы хотели бы сохранить запись с идентификатором 2, так как это уникальный родитель? –

ответ

0
SELECT * 
FROM table A 
WHERE a.ParentID IS NULL OR NOT EXISTS (SELECT 1 
       FROM table b 
       WHERE a.ParentID = b.ID 
       AND a.Feature_1 = b.Feature_1 AND a.Feature_2 = b.Feature_2) 
1
SELECT 
    Child.ID, 
    Child.ParentID, 
    Child.Feature_1, 
    Child.Feature_2 
FROM 
    MyTable AS Child 
    LEFT OUTER JOIN MyTable AS Parent 
     ON Child.ParentID = Parent.ID 
WHERE 
    Parent.Feature_1 <> Child.Feature_1 
    OR Parent.Feature_2 <> Child.Feature_2 
    OR Child.ParentID IS NULL 
ORDER BY 
    Child.ID 
Смежные вопросы