如何在同一查询中获取包含其组和子组的产品?

时间:2018-04-07 09:15:16

标签: sql sql-server database sql-server-2008 stored-procedures

我正在努力编写将返回产品,他们的群组和他们小组的父母的查询。

这是我的数据库架构:

enter image description here

一个产品只有一个与他直接相关的组,该组只能有一个与该组直接相关的父组。例如,我的结构如下所示:

Drinks

Alcohol drinks

           Vodka
           Jack Daniels

Non alcohol drinks

           Pepsi
           Juice

所以在上面的例子中:

  • 百事可乐有直接相关群体:非酒精饮料

该组的父组是Drinks

这意味着百事可乐的Id将被插入到表ArticleGroups中,也会在同一行中插入直接相关的Group - GroupId,这意味着我需要将pepsi的GroupId与表组连接,其中是pepsi的父组所以我可以得到两组(非酒精饮料和饮料)。

这是我到目前为止所写的内容,但我不确定这是否可以这样做,这真让我感到困惑......

Select ---
From Articles as T1 
Join ArticleGroups as T2 on T1.ArticleId = T2.ArticleId
Join Groups as T3 on T2.GroupId = T3.GroupId 
Join Groups as T4 on T3.ParentId = T4.GroupId

我写的这个查询令我困惑,因为它看起来像......

从文章加入文章组中选择一些东西以获得与文章直接相关的组,之后加入组以获取该直接相关组的标题和其他信息,之后我应该再次加入组,因为在同一个表中作为parentId是文章组的主要组合。

这真让我感到困惑..

在我的选择中,我需要获得文章,他的直接相关群体(非酒精饮料)和非酒精饮料的父母,这就是饮料......所以很多人加入同桌,让我很困惑。

预期结果应如下所示:

enter image description here

正如你所看到的那样,我需要从Article表中获取产品标题,我还需要将表格组中的产品组加入到组中,并且我还需要获取表组中的文章组的父组。

重要事项: Group Drinks就像您可以看到非酒精饮料和酒精饮料的父母组,它在表格组中定义..

任何形式的帮助都会很棒,

谢谢!

1 个答案:

答案 0 :(得分:0)

您的查询是正确的。如果你使用了更好的表别名,也许你会看到它更好:

Select a.*, g.name as subgroup, gp.name as parent_group
From Articles a left join
     ArticleGroups ag
     on ag.ArticleId = a.ArticleId left join
     groups g   -- lowest level group ("subgroup")
     on ag.GroupId = g.GroupId left join
     Groups gp  -- parent group
     on gp.GroupId = g.ParentId ;

我用外连接替换了内部连接,因此查询将返回所有文章,即使那些没有组或父组的文章。

数据结构没问题,但如果组开始拥有更多的层次结构,那么它会变得很麻烦