首先是相关模式:
A是列表条目表,其中包含ListID,Date和ItemID
B是具有ID和所有者(当前是文本)的基础项目表。
C是拥有ID(int),Name(varchar)和Parent(int)的所有者的表。 Parent是另一个成员的ID,如果它是顶级节点,则为null。此表只有2个级别,因此每个成员都是孩子或父母。
A.ItemID指向B.ID B.Owner指向C.Name C.Parent为null或指向另一个C.ID
现在问题......
我需要计算C中每个父项的给定列表(ListID和Date)上的条目数。我几乎有一个问题。查询是:
select C.owner, COUNT(B.ID) as Count from A
join B on A.ItemID = B.ID
join C on B.Owner= C.Owner
join C2 on C.Parent = C2.ID
Where date = '2011-01-10' and ListID = 1
Group by C2.Owner
order by C2.Owner
但它只计算与C中的子行匹配的条目。因为父行在父字段中没有自己的ID,所以即使有项目,它们也不会包含在聚合计数中表C中的父母直接拥有。我很确定我可以通过将这些值放入其中来解决问题,但这似乎是糟糕的设计,因为这些行实际上是他们自己的父母。
有没有办法管理此查询以解决此问题?我很难过。
或者,为了将他们自己的数据与他们的孩子的数据聚合在一起,是否可以让自己作为父级引用自己是否“好”?
感谢您提供的所有建议。如果不清楚,我可以更具体,但我试图保持不相关的信息。
-Dan
答案 0 :(得分:0)
您需要在C和C2上使用左连接。
C LEFT JOIN C2 ON C.Parent = C2.ID
这将导致所有行都包含在C中,如果C2中有相应的子节点,也会包含这些行。