【问题标题】:Find duplicate parent rows by evaluating child record set通过评估子记录集查找重复的父行
【发布时间】:2013-04-24 22:16:46
【问题描述】:

我试图在表 parent 中查找行,谁的 child 记录使其与父表中的另一条记录重复。因此,它类似于计数 > 1 的 group by,除了条件基于子记录是否匹配。在下面的示例表格图中,您会看到我有三个数据列,但我只想在比较中使用其中两个。

表格/列:

  • 父母
    • 父ID
  • 儿童
    • fkParentID
    • 字段1
    • 字段2
    • field3(忽略)

我愿意使用 MS SQL、C# 或 LINQ to SQL

【问题讨论】:

  • 您想查看所有孩子 100% 重叠的地方,还是只查看有 2 个父母的同一个孩子?
  • @JNK - 当有 100% 重叠时。
  • 我开始为此研究解决方案,但它有点增长,我没有时间看透它。我的建议是制作一个 CTE,列出所有被其他孩子欺骗的孩子,然后在该重复孩子的子组中找到任何没有孩子的 parentID。
  • @BogdanSahlean - 我不明白你的问题。你能改写一下吗?
  • @Peter:你想为给定的ParentID找到所有具有相同孩子的重复父母吗?

标签: c# sql-server linq linq-to-sql


【解决方案1】:

这是一个愚蠢的 Northwind 示例:

Select 
ods.OrderID 
, derived1.Quantity
, derived1.Discount 
, derived1.SETKey
, TotalsItemsInThisSet = derived1.MYC
, ThisSetCardinal = ROW_NUMBER()  OVER(PARTITION BY derived1.Quantity, derived1.Discount ORDER BY derived1.Quantity, derived1.Discount) 
from 
    dbo.[Order Details] ods
    join
    ( select Quantity, Discount , COUNT(*) as MYC , ROW_NUMBER() OVER (Order by Quantity, Discount) AS SETKey from dbo.[Order Details] where Quantity > 50 and Discount > 0 GROUP BY Quantity, Discount Having Count(*) > 1 ) derived1
    on ods.Quantity = derived1.Quantity and ods.Discount = derived1.Discount
order by  
    derived1.Quantity, derived1.Discount

结果:

OrderID     Quantity Discount      SETKey               TotalsItemsInThisSet ThisSetCardinal
----------- -------- ------------- -------------------- -------------------- --------------------
10361       55       0.1           1                    2                    1
10451       55       0.1           1                    2                    2
10269       60       0.05          2                    9                    1
10273       60       0.05          2                    9                    2
10419       60       0.05          2                    9                    3
10492       60       0.05          2                    9                    4
10570       60       0.05          2                    9                    5
10590       60       0.05          2                    9                    6
10637       60       0.05          2                    9                    7
10865       60       0.05          2                    9                    8
11012       60       0.05          2                    9                    9
10390       60       0.1           3                    4                    1
10485       60       0.1           3                    4                    2
10688       60       0.1           3                    4                    3
10845       60       0.1           3                    4                    4
10475       60       0.15          4                    4                    1
10693       60       0.15          4                    4                    2
10817       60       0.15          4                    4                    3
10990       60       0.15          4                    4                    4
10424       60       0.2           5                    4                    1
10567       60       0.2           5                    4                    2
10700       60       0.2           5                    4                    3
10847       60       0.2           5                    4                    4
10263       60       0.25          6                    7                    1
10263       60       0.25          6                    7                    2
10461       60       0.25          6                    7                    3
10802       60       0.25          6                    7                    4
10912       60       0.25          6                    7                    5
10918       60       0.25          6                    7                    6
11030       60       0.25          6                    7                    7
10854       65       0.15          7                    2                    1
10990       65       0.15          7                    2                    2
10339       70       0.05          8                    6                    1
10359       70       0.05          8                    6                    2
10605       70       0.05          8                    6                    3
10658       70       0.05          8                    6                    4
10658       70       0.05          8                    6                    5
11008       70       0.05          8                    6                    6
10395       70       0.1           9                    3                    1
10845       70       0.1           9                    3                    2
11033       70       0.1           9                    3                    3
10267       70       0.15          10                   4                    1
10324       70       0.15          10                   4                    2
10403       70       0.15          10                   4                    3
10543       70       0.15          10                   4                    4
10430       70       0.2           11                   2                    1
10773       70       0.2           11                   2                    2
10344       70       0.25          12                   3                    1
10372       70       0.25          12                   3                    2
10393       70       0.25          12                   3                    3
10359       80       0.05          13                   3                    1
10472       80       0.05          13                   3                    2
10865       80       0.05          13                   3                    3
10516       80       0.1           14                   2                    1
10765       80       0.1           14                   2                    2
10324       80       0.15          15                   2                    1
10633       80       0.15          15                   2                    2
10373       80       0.2           16                   2                    1
10847       80       0.2           16                   2                    2
10515       84       0.15          17                   2                    1
10983       84       0.15          17                   2                    2
10549       100      0.15          18                   2                    1
10854       100      0.15          18                   2                    2
11030       100      0.25          19                   2                    1
11030       100      0.25          19                   2                    2
10776       120      0.05          20                   2                    1
10894       120      0.05          20                   2                    2
10398       120      0.1           21                   2                    1
10451       120      0.1           21                   2                    2

【讨论】:

  • 基本上,对于每个“子表”重复项(基于 Quantity Discount ),您将取回所有父母。 “SetKey”对于任何匹配相同(数量折扣)的东西都是相同的值。 "ThisSetCardinal" 给你一个基数 ~within~ 每组。
  • 这不是一个糟糕的开始。如果我想手动遍历记录,这至少会告诉我需要检查哪些其他父记录。
  • " 正在尝试在父表中查找行,谁的子记录使其与父表中的另一条记录重复" 这与"至少告诉我哪些其他父记录我需要检查”?
  • 父级通常有多个子记录。我想找到两个或多个具有完全相同的子记录集的父母。这个查询向我展示了具有单个匹配子记录的所有其他父级。不要误会,感谢您的帮助,只是回答您的问题。
  • 哦....“同一组孩子”.........明白了。嗯。我会考虑那个的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 2012-10-15
  • 2019-09-24
  • 2016-07-03
  • 1970-01-01
  • 2014-03-18
相关资源
最近更新 更多