【问题标题】:Using ORDER BY with UNION and ALIASES将 ORDER BY 与 UNION 和 ALIASES 一起使用
【发布时间】:2016-12-21 12:59:15
【问题描述】:

我有一些工作 SQL 想要改进。当前 SQL 将提取链接到帐户的所有联系人的列表,包括他们的关系,并包括其他选项。这被用于一些脚本软件,这些软件使用代码在其中显示为一个问题,允许用户选择显示的条目以显示更多信息。

这很好用,但我希望主要租户拉到顶部,底部的其他选项,以及按字母顺序列出的所有其他选项。

这是当前代码:

SELECT [Relationship]+' - '+[Contact Name] AS DISPLAY , [Contact Name] AS  VALUE
FROM [Database]
WHERE ID = 'ID'
UNION
SELECT [Relationship]+' - '+[Contact Name] AS DISPLAY,  [Contact Name] AS VALUE
FROM [Database]
WHERE GroupID = 'GroupID' AND [Relationship] IS NOT NULL
UNION
SELECT 'Other' AS DISPLAY, 'Other' AS VALUE

此时会显示如下信息:

DAUGHTER - Miss A C
HUSBAND - Mr V C
Other
SON - Mr G B
TENANT - Mrs S C

我想首先将其列为租户,然后是其他所有内容:

TENANT - Mrs S C
DAUGHTER - Miss A C
HUSBAND - Mr V C
SON - Mr G B
Other

我尝试在代码末尾使用 ORDER BY,但发现只能按字母顺序排列。我还尝试将每个语句括起来并在其中插入 ORDER BY 函数,但这也不起作用。

有人能告诉我我缺少什么吗?别名和 UNION 似乎给我带来了问题,但我需要这些才能使核心代码正常工作。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    您可以使用CASE WHEN 语句来定义您要使用的优先级。

    例如,在查询末尾使用此 ORDER BY 子句:

    ORDER BY CASE Relationship WHEN 'TENANT' THEN 0 WHEN 'Other' THEN 2 ELSE 1 END
    

    这样,当关系为租户时,我们分配优先级 0,当关系为其他时分配优先级 2,其余的分配优先级 1,我们使用该优先级对结果集进行排序。

    【讨论】:

    • 谢谢你,我之前尝试在这个上设置一个案例,但没有成功,但我会使用这个结构尝试一下
    • 你是对的,下面的 Gordon 结构将所有内容放在一个查询中是拼图的最后一块。不过,所有 cmets 都非常有帮助,感谢您抽出宝贵时间 :)
    【解决方案2】:

    如果您希望结果按特定顺序排列,请使用明确的ORDER BY。在带有UNION/UNION ALL 查询的 SQL Server 中,您可以使用子查询并按列名引用列:

    SELECT t.*
    FROM ((SELECT [Relationship]+' - '+[Contact Name] AS DISPLAY , [Contact Name] AS VALUE
           FROM [Database]
           WHERE ID = 'ID'
          ) UNION
          (SELECT [Relationship]+' - '+[Contact Name] AS DISPLAY,  [Contact Name] AS VALUE
           FROM [Database]
           WHERE GroupID = 'GroupID' AND [Relationship] IS NOT NULL
          ) UNION
          (SELECT 'Other' AS DISPLAY, 'Other' AS VALUE
          )
         ) t
    ORDER BY (CASE WHEN DISPLAY = 'TENANT' THEN 1
                   WHEN DISPLAY = 'OTHER' THEN 3
                   ELSE 2
              END);
    

    【讨论】:

    • 太棒了,谢谢戈登。这确实有效,但仅适用于 UNION ALL,而不是 UNION,因此它现在带回了重复值,但我想我知道为什么。有什么理由可以使用 UNION ALL 而不是 UNION?只是想了解有关此功能如何工作的更多信息
    • @CraigJones。 . .它应该与UNION 一起使用。我只是更喜欢UNION ALL,除非有明确的理由删除重复项。
    • 你是对的,我最后打错了一些东西,但它也帮助我了解了我的代码,所以这是一个快乐的意外!效果很好:)
    猜你喜欢
    • 1970-01-01
    • 2014-09-26
    • 2020-06-22
    • 2014-05-30
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    相关资源
    最近更新 更多