寻找所有孩子也匹配的匹配父母

时间:2011-08-04 18:37:06

标签: sql linq

我正在尝试在MS SQL Server 2008中编写一个sql查询,该查询将匹配父项匹配并且所有子项匹配的父行。

假设我有这个基本的表结构:

ParentTable: 
  ParentID, Item, Price

ChildTable:
  ChildID, ParentID, Accessory, Price

我希望得到父母在物品和价格上匹配的父母组合,他们拥有相同数量的孩子,每个孩子都与配件和价格相匹配。

例如:

ParentTable:
---------------------
1, "Computer", 1000
2, "Stereo", 500
3, "Computer", 500
4, "Computer", 1000

ChildTable:
---------------------
1, 1, "Mouse", 10
2, 1, "Keyboard", 10
3, 2, "Speakers", 50
4, 3, "Keyboard", 10
4, 3, "Mouse", 10
5, 4, "Keyboard", 10
6, 4, "Mouse", 10

预期结果将类似于

ParentID, Grouping
---------------------
1, 1
2, 2
3, 3
4, 1

这意味着ParentID 1和4完全相同,2和3是唯一的。我不关心结果的格式,只要我得到匹配的父母列表。

我不反对在.net中做(部分或全部)这个。

2 个答案:

答案 0 :(得分:0)

你的问题有点含糊不清,但我想我还是试一试。

在这里。自由格式SQL。如果没有访问某些DML,很难完全正确。

所以这将是我的一般方法。这应该在SQL Server中运行,也可能在Oracle中运行。我并不是说这是完美的。我的心理图式与上面的描述完全不符,我将把它作为读者的练习。我直接打字了。

SELECT DISTINCT p.id,p.name,p.dte,q.cnt
FROM parent p
JOIN
 (
  select p.id, p.dte, count(*) cnt
  from parent p 
  join child ch 
  on ch.pid = p.id
  group by p.id, p.dte
 ) q
 ON p.id=q.id and p.dte=q.dte
GROUP BY p.id,p.name,q.cnt
ORDER BY p.id,p.name,q.cnt
顺便问一下:你的问题有点含糊不清。


更新:

这个函数看起来像子行到csv方向

http://sql-ution.com/function-to-convert-rows-to-csv/

答案 1 :(得分:0)

好的,如果你可以用临时表做这个,那么这可能会给你一些想法。在我的头顶,所以没有检查语法。此外,这是有限的,因为bigint通常只会达到2 ** 63或其他东西。 首先将独特的儿童配件和价格放入#child

create table #child ( accessory varchar, price decimal, id identity, 
bnumber bigint null)
insert into #child(accessory, price) 
select accesory,price from childtable group by accessory price

假设id为1,2,3,4等

update #child set bnumber = 2**(id-1)

将bnumber设置为1,2,4,8等(这是bigint限制可能启动的地方)。所以现在你有了

mouse,   10,1,1 
keyboard,10,2,2 
speakers,50,3,4

现在您可以按父母

对这些数字求和
select p.item, sum(ctemp.bnumber)
from parent p, child c, #child ctemp
where p.parentid = c.parentid
and   c.accessory = ctemp.accessory
and   c.price     = ctemp.price
group by p.item

1, 3
2, 4
3, 3
4, 3

..我认为这是你想要的答案。这有点笨拙,这是漫长的一天(!),但它可能会有所帮助。