【问题标题】:Distinct rows based on One column in multi union基于多联合中的一列的不同行
【发布时间】:2013-01-03 05:26:07
【问题描述】:

我正在构建一个基于 4 个表的分层菜单。在做研究之后,我能想到的唯一解决方案是使用 UNION 来做,到目前为止我很接近,但我仍然没有得到想要的结果。

我正在使用的4个表是

  1. PageID 为 PK 的页表(其中包含 cms 的实际页面)
  2. PageID 为 FK 的文章表(其中有文章)
  3. PageID 为 FK 的文章分类表(此表有文章分类)
  4. PageID 为 FK 的杂志表(杂志表保存杂志信息)

我不得不根据对我的previous question which is directly related to this question 提出的一些建议对我的数据库进行一些更改,上一个问题包含有关数据库的详细信息。

我需要这些专栏PID, MENU, Handler,PageLangID, ParentID,IssueID, CatID,MenuPosition 为了创建我的分层菜单,我在下面编写了所需的列,但我无法在菜单上运行 DISTINCT,因此我将只获得唯一行并基于该结果集我可以创建我的菜单。

当我尝试添加 DISTINCT (Menu) 时,它会产生语法错误。

根据previous question 中提到的我的要求,我不确定这种方法是否可行,或者我应该采取其他一些明确或更专业的方法

查询

 SELECT PID, MENU, Handler, PageLangID, ParentID,IssueID, CatID, MenuPosition 
FROM (
    --Pages Table 
    SELECT PageId AS PID,SUBSTRING(PageName,0,20) AS MENU,SUBSTRING(PageInternalLinkURL,0,24) AS Handler, PageLangID,PageInheritance AS ParentID, 1 AS IssueID, 1 AS CatID, 
            PageLinkPosition as MenuPosition  FROM pg_Pages  WHERE PageLangID = 1
    UNION
    --Article Table
    SELECT p.PageID as PID, SUBSTRING(c.ArticleCategoryName,0,20) AS MENU,SUBSTRING(p.PageInternalLinkURL,0,24) AS Handler,LanguageID,p.PageID  AS ParentID,IssueID,c.ArticleCategoryID AS CatID,
           1 AS MenuPosition FROM art_Articles a JOIN art_Category  c ON a.ArticleCategoryID = c.ArticleCategoryID JOIN pg_pages p ON p.PageID = a.PageID    WHERE LanguageID =1  
    UNION
    --Article Category Table
    SELECT p.PageID AS PID, SUBSTRING(c.ArticleCategoryName,0,20) AS MENU,SUBSTRING(p.PageInternalLinkURL,0,24) AS Handler, LangID,p.PageID,1, ArticleCategoryID,
          1 AS MenuPosition FROM art_Category c JOIN pg_Pages p ON c.PageID = p.PageID WHERE LangID =1  
    UNION
    --Magazine Table
    SELECT p.PageID AS PID, CAST(IssueCode AS varchar(10)),SUBSTRING(p.PageInternalLinkURL,0,24) AS Handler,LangID,p.PageID AS ParentID, m.IssueID AS IssueID, 1, 
           1 AS MenuPosition FROM Magazine m   JOIN pg_pages p ON m.PageID = p.PageID   WHERE LangID =1   
    ) AS T  WHERE T.PageLangID = 1 ORDER BY MenuPosition 

输出

PID         MENU                 Handler                  PageLangID  ParentID    IssueID     CatID       MenuPosition
----------- -------------------- ------------------------ ----------- ----------- ----------- ----------- ------------
5           Book Review          Articles.aspx            1           5           5           18          1
5           Business             Articles.aspx            1           5           5           16          1
5           Group News           Articles.aspx            1           5           5           6           1
5           Infrastructure       Articles.aspx            1           5           5           17          1
5           Politics             Articles.aspx            1           5           1           1           1
5           Politics             Articles.aspx            1           5           3           1           1
5           Politics             Articles.aspx            1           5           4           1           1
5           Politics             Articles.aspx            1           5           5           1           1
6           Book Review          Article-Category.aspx    1           6           1           18          1
6           Business             Article-Category.aspx    1           6           1           16          1
6           Chairman's Message   Article-Category.aspx    1           6           1           9           1
6           Culture              Article-Category.aspx    1           6           1           3           1
6           Economy              Article-Category.aspx    1           6           1           2           1
6           Editorial Message    Article-Category.aspx    1           6           1           8           1
6           Finance              Article-Category.aspx    1           6           1           19          1
6           Group News           Article-Category.aspx    1           6           1           6           1
6           Habtoor Leighton Gr  Article-Category.aspx    1           6           1           5           1
6           Infrastructure       Article-Category.aspx    1           6           1           17          1
6           Lifestyle            Article-Category.aspx    1           6           1           20          1
6           People               Article-Category.aspx    1           6           1           7           1
6           Politics             Article-Category.aspx    1           6           1           1           1
6           Sports               Article-Category.aspx    1           6           1           4           1
12          102                  Default.aspx             1           12          3           1           1
12          103                  Default.aspx             1           12          4           1           1
12          106                  Default.aspx             1           12          1           1           1
12          109                  Default.aspx             1           12          5           1           1
1           Home                 Default.aspx             1           0           1           1           10
11          Video                Videos.aspx              1           10          1           1           10
2           About Us             Page.aspx                1           0           1           1           20
5           Articles             Articles.aspx            1           0           1           1           20
6           Categories           Article-Category.aspx    1           0           1           1           25
3           News                 News.aspx                1           0           1           1           30
12          Archive              Default.aspx             1           0           1           1           40
10          Multimedia           Multimedia.aspx          1           0           1           1           60

【问题讨论】:

  • 以上output是你的预期输出还是当前输出?如果是后者,您能否向我们展示您的预期输出? :)
  • 这是当前输出。如果你会看到它有多个Politics条目
  • 我还想进一步细化这个查询,以便它只显示那些实际上有文章 & 针对特定问题的类别

标签: sql sql-server sql-server-2008 distinct union


【解决方案1】:

您在外部选择语句中使用了 order by。 按照不使用 distinct 语句的顺序,

所以,在子选择中执行 DISTINCT,在外部选择中执行 ORDER BY。

希望这将有助于解决您的问题。

【讨论】:

    【解决方案2】:

    所有 SELECT 语句都需要 DISTINCT

    SELECT DISTINCT PID, MENU, Handler, PageLangID, ParentID,IssueID, CatID, MenuPosition
    ...
    

    【讨论】:

    • 我使用了它,但在某些情况下它并没有给我想要的结果我会尝试 DISTINCT ON article & article Category table table 看看它是否有效
    • 我想让MENU 的所有结果都与众不同
    • 我会看看我是否可以删除文章表查询的查询,然后我可以在 main 上运行 DISTINCT 以获得我想要的结果。但现在我只是看看我是否需要这个查询。
    • 因为您的文章表在相同的 MENU 上包含不同的 IssueID。您只需为 DISTINCT 选择一项
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多