在SQL表中查找相同类型的子项具有不同父项的行

时间:2014-10-26 22:49:39

标签: sql sql-server-2012 parent-child

我有一个采用以下形式的数据库表 methodID,parentID,headerID和唯一标识符的临时唯一ID。此表没有外键,父ID只指向同一个表中的另一个条目(稍后将这些条目转换为层次结构ID,但这里并不重要)。

我有四种不同类型的方法(1-4),每种方法必须始终是同一类型方法的子类。例如,如果方法2是方法1的子节点,则每个方法2必须具有方法1作为其父节点。

我需要一个验证,它将选择违反此规则的任何值。

我一直在尝试使用以下选项来对信息进行排序:

SELECT *,
    'A method must always have the same type of parent method' 
FROM dr_Allocation_Layer_D_Validation valTable
LEFT JOIN dr_Allocation_Layer_D_Validation DUPE ON DUPE.vd_headerID = valTable.vd_headerID
AND DUPE.vd_temp_uniqueID = valTable.vd_parentID

我一直在尝试选择中的WHERE子句只选择方法,父方法类型对于每个方法并不总是相同。如果有人能帮我解决这个问题,我将不胜感激。

此外,我在SQL Server 2012中工作。提前感谢!

2 个答案:

答案 0 :(得分:1)

使用having条件选择具有1个以上不同parentID的方法。因为您需要的所有值都在行中,所以您不需要连接就可以解决这个问题,但是您需要一个连接来整齐地显示有问题的行。

SELECT DUPE.*
  'A method must always have the same type of parent method' 
FROM (
  select vd_methodID
  from dr_Allocation_Layer_D_Validation
  group by vd_methodID
  having count(distinct vd_parentID) > 1) m
JOIN dr_Allocation_Layer_D_Validation DUPE ON DUPE.vd_methodID = m.vd_methodID

答案 1 :(得分:1)

您可以使用exists检查是否存在具有相同methodID和不同parentID的其他行。

select * , 'A method must always have the same type of parent method' 
from dr_Allocation_Layer_D_Validation t1
where exists (
    select 1 from dr_Allocation_Layer_D_Validation t2
    where t2.vd_methodID = t1.vd_methodID
    and t2.vd_parentID <> t1.vd_parentID
)