【问题标题】:Find rows in SQL table where children of the same type have different parents在 SQL 表中查找相同类型的子级具有不同父级的行
【发布时间】:2014-10-27 12:52:04
【问题描述】:

我有一个数据库表,其形式为 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。提前致谢!

【问题讨论】:

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


    【解决方案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
    )
    

    【讨论】:

      【解决方案2】:

      使用having 条件选择具有多个不同 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
      

      【讨论】:

      • 我实际上尝试过这种方法,但无法让它发挥作用。我不断收到错误消息:Msg 164, Level 15, State 1, Line 7 每个 GROUP BY 表达式必须至少包含一个不是外部引用的列。
      • 也许你正在使用sqlserver?无论如何,请用您正在使用的 rdbms 标记问题。不管怎样,试试最新的(更通用的)编辑
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      相关资源
      最近更新 更多