如何对没有特定节的union语句的sql查询进行排序

时间:2013-10-04 03:54:02

标签: sql sql-server sorting sql-order-by union

我有一个sql查询,我试图在数据库中获取子组并绑定到asp.net中的下拉列表。在数据库方面,我使用的是MSSQL server 2008 R2,我对它有以下查询:

SELECT -1   ItemSubGroupId,
'Select Sub Group' AS ItemSubGroupName

    UNION

SELECT ItemSubGroupId,
ItemSubGroupName
FROM dbo.tblSetupItemSubGroup SG
WHERE SG.ItemMainGroupId = 17

结果是: Result without sorting

现在我想按ItemSubGroupName对所有子组进行排序,在我对其进行排序后,它会给我一个结果,如

     SELECT -1  ItemSubGroupId,
'Select Sub Group' AS ItemSubGroupName

    UNION

SELECT ItemSubGroupId,
ItemSubGroupName
FROM dbo.tblSetupItemSubGroup SG
WHERE SG.ItemMainGroupId = 17
ORDER BY ItemSubGroupName

After Sorted

排序后,“选择子组”名称也按显示方式排序。有没有办法在没有“选择子组”部分的情况下对其进行排序?

5 个答案:

答案 0 :(得分:2)

目前还不清楚你在问什么。

我认为您可能会尝试在列表顶部设置“选择子组”,其余部分按字母顺序排序。

要做到这一点,你需要做类似的事情:

SELECT -1, 'Select an item', 0
UNION ALL
SELECT 1, '1-test', null
UNION ALL
SELECT 2, '2-test', null
UNION ALL 
SELECT 3, '0-test', null
ORDER BY 3 DESC,2;

第三列的顶部是您想要的项目0,其余行的NULL。然后,该查询按DESC顺序中的该列排序,然后按第二列排序。这会将所需的项目放在顶部,并保留其余项目的字母排序。

enter image description here

这是一个更具体的例子:

CREATE TABLE OrderTest
(
    ID INT NOT NULL
    , Data NVARCHAR(255)
);

INSERT INTO OrderTest (ID, Data) VALUES (1, '1st test');
INSERT INTO OrderTest (ID, Data) VALUES (1, '2nd test');
INSERT INTO OrderTest (ID, Data) VALUES (1, '3rd test');
INSERT INTO OrderTest (ID, Data) VALUES (1, '4th test');

SELECT -1 AS ID, 'Select an item' AS Data, 0 AS OrderByCol
UNION ALL
SELECT ID, Data, NULL AS OrderByCol
FROM OrderTest
ORDER BY OrderByCol DESC, Data;

enter image description here

答案 1 :(得分:0)

您必须通过创建子查询

来订购
SELECT ItemSubGroupId, ItemSubGroupName
FROM (
    SELECT -1  ItemSubGroupId,
    'Select Sub Group' AS ItemSubGroupName

        UNION

    SELECT ItemSubGroupId,
    ItemSubGroupName
    FROM dbo.tblSetupItemSubGroup SG
    WHERE SG.ItemMainGroupId = 17
) X
ORDER BY 
    CASE ItemSubGroupId WHEN -1 THEN 0 ELSE 1 END,
    ItemSubGroupName

答案 2 :(得分:0)

Yo可以添加一个虚拟列tag来执行排序并使用派生表。 无需在最终结果集中按列tag检索订单。

SELECT ItemSubGroupId,ItemSubGroupName
FROM
(
 SELECT -1  ItemSubGroupId,
'Select Sub Group' AS ItemSubGroupName, 1 as tag

    UNION

SELECT ItemSubGroupId, 
ItemSubGroupName,2 as tag
FROM dbo.tblSetupItemSubGroup SG
WHERE SG.ItemMainGroupId = 17
) z
ORDER BY tag,ItemSubGroupName

不要忘记在上面的代码中为派生表,z提供别名,否则sql server会抛出语法错误。

答案 3 :(得分:0)

只需在查询中添加一个“硬编码”列,然后按其排序。

SELECT -1  ItemSubGroupId, 'Select Sub Group' AS ItemSubGroupName, 'A' OrderCol

UNION

SELECT ItemSubGroupId, ItemSubGroupName, 'B' OrderCol
FROM dbo.tblSetupItemSubGroup SG
WHERE SG.ItemMainGroupId = 17
ORDER BY OrderCol, ItemSubGroupName

答案 4 :(得分:0)

最简单的方法是在CASE

中使用ORDER BY语句
...
ORDER BY
    CASE WHEN ItemSubGroupName = 'Select Sub Group' 
        THEN 0 
        ELSE 1 END