可以说我有以下架构:
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
of过滤purchase
。 - 由于
father_id
关系在另一个表中,这意味着必须进行连接。这又是可怕的,但我无法更改数据库以在表中包含一个father_id
字段。person
- 如果一个人没有父亲,则
relationships
表中没有条目。这会让事情变得更加复杂。
现在我已经阅读了这些示例,并且我了解了其中的一些:如何在查询SQL Server 递归查询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'
但是,它根本不起作用。
任何帮助,将不胜感激。