我正在尝试在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中做(部分或全部)这个。
答案 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方向
答案 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
..我认为这是你想要的答案。这有点笨拙,这是漫长的一天(!),但它可能会有所帮助。