2011-08-04 12 views
0

私はMS SQL Server 2008で親が一致する親の行と一致するすべての子の行と一致するSQLクエリを作成しようとしています。私はアクセサリーに一致するそれぞれの、親が品目と価格に一致すると、彼らは子供の数が同じParentIDsのグループ化を取得したいすべての子供も一致する親を見つける

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 1と4がまったく同じであり、2と3が一意であることを含意するでしょう

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

ようなものになるだろう。私は結果のフォーマットについて本当に気にしません、私が一致する親のリストを取得する限り。

私はこれを(一部またはすべて).netでもやっているのに反対していません。

+0

どのデータベースプラットフォームですか? – Randy

+0

あなたの例にはPNameとPDateという列はありません。予想される結果をもう少し見直して説明できますか? – ingo

+0

これはSQL Serverにあります。私はもう少し明確になるように質問を編集しました。 – BFreeman

答えて

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 

btw:あなたの質問は少しあいまいです。


UPDATE:

この関数はCSV方向に子行のために有望に見える

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

+0

ご迷惑をおかけして申し訳ありません。これはほとんど機能しますが、子供の数だけが懸念事項ではありません。彼らはそれぞれ一致する必要があります。 – BFreeman

+0

子IDの順序付きベクトルがある場合は、比較を行うことができます。探索するための1つのアプローチは、SQLピボットコマンドの一部です。より良いオプションは、順序付きベクトルを関数を介してcsv文字列として返すことです。同じ違いがありますが、順序付けられたベクトルの一時テーブルはより速くなります。一般に、SQL言語は、この種のセットロジックをよくしていません(私が見ていない間に進化していないと仮定して)。 – sgtz

+0

ピボットは助けにはなりません。これは関数を介して順序付けられたベクトルを残します。それ以外の場合は、限られたデカルト積(yuck)にdistinctを導入する必要があります+カウントが上記のクエリで生成されたカウントと一致するようにしてください。 – sgtz

0

OKあなたは一時テーブルでこれを行うことができれば、これはあなたのアイデアを与える可能性があります。私の頭の上から外れるので、構文はチェックされません。また、これは限られています。なぜなら、bigintは通常、2 ** 63または何かにしか上がらないからです。 まずbnumber 1,2,4,8などに1,2,3,4など

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

セットになります#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にユニークな子のアクセサリーや価格を置く(このbigintの制限が入り込む場所です)。だから今は

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

は今、あなたは私はあなたが欲しい答えだと思う..which

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

与える親

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 

することにより、これらの数値を合計することができています。これはちょっとしたもので、長い一日でしたが、それは助けになるかもしれません。

関連する問題