次のスキーマがあるとしましょう。
person (person_id, person_account, name)
relationships (person_id, father_id)
purchases(person_account, total, type)
免責事項:私はこのスキーマを設計していません。ひどいことを知っているので、お詫びします。また、これは例です。これははるかに複雑です。また、これはJDBCTemplateで使用するクエリであることに注意してください。これが、タグを含めた理由です。
count
今、私は人の購入を取得したいと思います、そして彼または彼女の息子は購入し、彼らの息子は購入します。私は最初の人に特定の出発点が欲しいです。
これまでに見た例とは異なる点がいくつかあります。
- 特定の出発点(それがそうだとしましょう
person_account
)。 - テーブルにはフィールド
purchases
がないため、作業が複雑になります。person_id
- 私
count
は他のものではなく、欲しいです。 type
でフィルタリングしたいpurchase
。- 関係は別のテーブルにあるため
father_id
、結合を行う必要があることを意味します。繰り返しますが、それは恐ろしいことですが、テーブルにfather_id
フィールドを含めるようにデータベースを変更することはできません。person
relationships
人に父親がいない場合、テーブルにエントリはありません。それはそれをさらに複雑にするでしょう。
今、私は例を読み、それらのいくつかを理解しました:クエリSQLServer再帰クエリhttp://msdn.microsoft.com/en-us/library
で再帰を使用して親のすべての子とその子を取得する方法/ms186243.aspx
しかし、私は開始点と終了点を理解するのに問題があります。私の出発点には父親がいる可能性があるので、それを無効にすることはできません。私のエンドポイントは、基本的purchases
にテーブルにエントリがない人から取得する必要があります。relationships
だから私が考えているのは:
declare @id int = 234
;with CTEexample as (
select p.person_account, p.person_id, p.type, r.father_id from purchases as s
join person p on p.person_account = s.person_account
join relationships r on r.person_id = p.person_id
where r.person_id = @id
union all
select p.person_account, p.person_id, p.type, r_father_id from purchases as s
join person p on p.person_account = s.person_account
join relationships r on r.person_id = p.person_id
join CTEexample c on p.person_id = r.father_id
)
select count(*) from CTEexample
where type = 's'
ただし、まったく機能していません。
どんな助けでもいただければ幸いです。