MSSQL查询ORDER BY按表存储顺序而非数值排序问题问询
MSSQL自定义排序顺序解决方案
你当前使用的原始查询代码如下:
all = 'SELECT Master_Sub_Account , cAccountTypeDescription , Debit , Credit FROM [Kyle].[dbo].[PostGL] AS genLedger'\ ' Inner JOIN [Kyle].[dbo].[Accounts] '\ 'on Accounts.AccountLink = genLedger.AccountLink '\ 'Inner JOIN [Kyle].[dbo].[_etblGLAccountTypes] as AccountTypes '\ 'on Accounts.iAccountType = AccountTypes.idGLAccountType'\ ' WHERE genLedger.AccountLink not in (161,162,163,164,165,166,167,168,122)'\ ' AND genLedger.TxDate > ?'\ ' ORDER BY iAccountType'
SQL Server本身不存在稳定可复用的“原始存储顺序”,无ORDER BY子句时的返回顺序受执行计划、数据页分布、存储引擎调度等多重因素影响,每次查询可能不一致,不建议依赖该特性做顺序控制。根据你的需求可选择以下方案:
- 方案1:临时查询快速调整
直接删除最后一行的' ORDER BY iAccountType'即可,该方式仅适合临时一次性查询,生产环境不建议使用,无法保证后续查询结果顺序和你当前看到的一致。 - 方案2:使用账户类型表内置排序字段(推荐)
检查[_etblGLAccountTypes]表是否存在自增主键、记录创建时间、排序权重这类可以反映记录录入顺序的字段,比如存在CreateTime创建时间字段时,将排序子句修改为' ORDER BY AccountTypes.CreateTime'即可得到和表内记录录入顺序一致的排序结果。 - 方案3:手动指定业务排序规则(最可控)
如果需要固定业务层面的排序优先级,可通过CASE语句自定义排序权重,修改后的查询示例如下(可根据你实际需要的顺序调整CASE内的枚举值和优先级数字):
all = 'SELECT Master_Sub_Account , cAccountTypeDescription , Debit , Credit FROM [Kyle].[dbo].[PostGL] AS genLedger'\ ' Inner JOIN [Kyle].[dbo].[Accounts] '\ 'on Accounts.AccountLink = genLedger.AccountLink '\ 'Inner JOIN [Kyle].[dbo].[_etblGLAccountTypes] as AccountTypes '\ 'on Accounts.iAccountType = AccountTypes.idGLAccountType'\ ' WHERE genLedger.AccountLink not in (161,162,163,164,165,166,167,168,122)'\ ' AND genLedger.TxDate > ?'\ ' ORDER BY CASE cAccountTypeDescription '\ ' WHEN ''资产'' THEN 1 '\ ' WHEN ''负债'' THEN 2 '\ ' WHEN ''所有者权益'' THEN 3 '\ ' WHEN ''收入'' THEN 4 '\ ' WHEN ''费用'' THEN 5 '\ ' ELSE 6 END'
内容的提问来源于stack exchange,提问作者KyleStranger
相关产品推荐
相关产品推荐

