我最近在我的数据库(SQL Server 2005)中的某些表中添加了几个字段,以允许用户自定义行的排序顺序。我对所有表都遵循了这种模式:
-- Alter the InvoiceStatus table
ALTER TABLE [dbo].[InvoiceStatus] ADD [Disabled] bit NOT NULL DEFAULT 0
GO
ALTER TABLE [dbo].[InvoiceStatus] ADD [SortOrder] int NOT NULL DEFAULT 0
GO
-- Use the primary key as the default sort order
UPDATE [dbo].[InvoiceStatus]
SET [SortOrder] = [InvoiceStatusId]
GO
通常,正如您所看到的,我已将主键用作默认排序顺序。然而,我现在处于这种情况,我想使用表格中文本字段的字母顺序作为默认排序顺序。
使用上面的表作为示例(具有文本字段[InvoiceStatusName]
),是否有一个类似的好的和简短的查询我可以编写使用[InvoiceStatusName]
的字母顺序作为默认排序顺序?
的更新
问题已经得到解答,但有些人已经指出这个解决方案可能并不理想,所以我只想为将来的参考添加一些上下文。这是一个旧系统(不是传统的旧系统,但已经存在了很多年),使用了一些不同的地方。
应用程序中有多个列表/下拉列表,其中包含典型的“状态”类型(例如发票状态,订单状态,客户类型< / em>等)。回到首次编写系统时,这些是每个地方都在使用的标准值(不打算以任何方式进行更改),但是有些用户已经开始请求添加新状态,删除不再使用的状态并指定自定义排序顺序(一个状态可能更频繁使用,因此很高兴将它放在列表的顶部)。
我发现执行此操作的最简单方法(无需使用太多旧代码)是向所有相关表添加两个新字段Disabled
和SortOrder
。 Disabled
字段用于“隐藏”未使用的类型(由于引用完整性而无法删除它们,并且还需要保留它们保存的值),SortOrder
字段就是这样的用户可以指定自己的自定义排序顺序。由于所有相关表也共享这两个相同的列,因此很容易创建一个简单的接口来以通用方式处理排序(和禁用)。
答案 0 :(得分:6)
;WITH so AS
(
SELECT
SortOrder,
ROW_NUMBER() OVER (ORDER BY InvoiceStatusName) AS rn
FROM dbo.InvoiceStatus
)
UPDATE so SET SortOrder = rn
答案 1 :(得分:4)
您可以使用ROW_NUMBER()函数将已排序的名称映射为整数。
UPDATE dbo.InvoiceStatus
SET SortOrder = ivsn.Number
FROM dbo.InvoiceStatus ivs
INNER JOIN (
SELECT dbo.InvoiceStatusID
, [number] = ROW_NUMBER() OVER (ORDER BY InvoiceStatusName)
FROM dbo.InvoiceStatus
) ivsn ON ivsn.InvoiceStatusID = ivs.InvoiceStatusID
你应该问问自己这个方案是否是解决问题的最佳方案。这样的实现不能很好地扩展。
答案 2 :(得分:1)
您选择实现表排序的方式很不寻常,显然仅限于按整数排序。
我真的建议您以另一种方式重新设计排序子系统。
例如,在某个地方有一个元数据表,其中包含用户想要排序的列的名称,然后在相关查询上使用ORDER BY (columnname)
编辑:哦等等,我们正在讨论查找表并让用户更改订单。现在我已经清楚了解你的实现对我来说更有意义。