1

我有一个 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

结果是: 结果不排序

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

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

    UNION

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

排序后

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

4

5 回答 5

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顺序排序,然后是第二列。这会将所需的项目放在顶部,并保留其余项目的字母排序。

在此处输入图像描述

这是一个更具体的例子:

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;

在此处输入图像描述

于 2013-10-04T04:15:27.903 回答
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
于 2013-10-04T04:00:54.797 回答
0

哟可以添加一个虚拟列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 会抛出语法错误。

于 2013-10-04T04:25:29.323 回答
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
于 2013-10-04T04:27:44.537 回答
0

最简单的方法是CASE在你的ORDER BY

...
ORDER BY
    CASE WHEN ItemSubGroupName = 'Select Sub Group' 
        THEN 0 
        ELSE 1 END
于 2013-10-04T04:31:33.400 回答