2011-01-10 73 views
0

首先,培训相关的模式:SQL查询问题,自引用父ID

A是ListID,日期列表条目表,并ITEMID

B是与标的物的表ID和所有者(目前是文本)。

C是所有者的ID为(INT)的表,名称(VARCHAR)和父(INT)。 父项是另一个成员的ID,如果它是顶级节点,则为null。这张表只有两层,所以每个成员都是孩子或父母。

A.ItemID点B.ID B.Owner点C.Name C.Parent null或指向另一个C.ID

现在的问题......

我需要计算给定列表(ListID和Date)上C中每个父项的条目数。我几乎有一个问题。查询:

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

您需要在C和C2上使用左连接。

C LEFT JOIN C2 ON C.Parent = C2.ID 

这将导致由C包括了所有的行,并且,如果在C2中的相应子,将被包括在内。

+0

首先,遗憾的坏格式。固定。我尝试了LEFT JOIN,看到没有任何变化,但在futher思考就可以了,然后我尝试了左连接在它上面(左连接上B.Owner = C.Owner C),我得到什么似乎是正确的数字我现在计数,但它们显示为无效所有者,这可能是正确的。我可能在B中有一些空的所有者。我需要更多地查看数据以确认,但这可能是答案,也可能更接近一步。一旦我可以确认今晚,我会用支票回头。谢谢! – nycdan 2011-01-10 23:10:52