【问题标题】:SQL query problem in table with self-referencing parent ID自引用父 ID 表中的 SQL 查询问题
【发布时间】:2011-01-11 07:08:28
【问题描述】:

首先是相关架构:

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 和日期)上的条目数。我几乎遇到了一个问题。查询是:

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 中的父母所有。我相当确定我可以通过将这些值放入其中来解决问题,但这似乎是糟糕的设计,因为这些行实际上是它们自己的父母。

有没有办法管理这个查询来解决这个问题?我被难住了。

或者,是否可以让行将自己作为父级引用,以便将自己的数据与其子级的数据聚合起来?

感谢您在此提供的所有建议。如果不清楚,我可以更具体一些,但我会尽量避免不相关的信息。

-丹

【问题讨论】:

    标签: sql-server-2008 parent-child self-join


    【解决方案1】:

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

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

    这将导致从 C 中包含所有行,并且,如果 C2 中有相应的子项,则也将包含该子项。

    【讨论】:

    • 首先,很抱歉格式错误。固定的。我尝试了左连接并没有看到任何变化,但在进一步思考时,我尝试了它上面的左连接(B.Owner = C.Owner 上的左连接 C),我得到了我的似乎是正确的数字现在很重要,但它们显示为 Null 所有者,这可能是正确的。我可能在 B 中有一些空所有者。我需要更多地查看数据以确认,但这要么是答案,要么更接近。一旦我今晚可以确认,我会用支票转回来。谢谢!
    • 在做一些年终整理工作后,我发现我最终确实将 ParentID 放入了作为父母的记录中。这没有缺点。
    猜你喜欢
    • 2018-04-30
    • 2020-10-19
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2015-08-19
    • 1970-01-01
    相关资源
    最近更新 更多