我有一个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
排序后,“选择子组”名称也按显示方式排序。有没有办法在没有“选择子组”部分的情况下对其进行排序?
答案 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
顺序中的该列排序,然后按第二列排序。这会将所需的项目放在顶部,并保留其余项目的字母排序。
这是一个更具体的例子:
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;
答案 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