如果提到的话,按特定值自定义SQL记录集顺序

时间:2013-01-21 14:25:55

标签: sql sql-server select sql-order-by

我有一个在线商店webapp,我用经典的ASP和SQL编写,我需要项目订单结果的帮助。

我有一个名为“items”的表,如下所示:

ITEM_NUMBER | DESCRIPTION | PRICE | NEXT_ITEM |
-----------------------------------------------
0001          Item 0001       1.5
-----------------------------------------------
0002          Item 0002       2
-----------------------------------------------
0003          Item 0003       1
-----------------------------------------------
0004          Item 0004       3
-----------------------------------------------
0005          Item 0005       7        0030
-----------------------------------------------
.
.
.
.
-----------------------------------------------
0030          Item 0030       3

我想要做的是保留ITEM_NUMBER的订单,因为它是按项目编号,因为NEXT_ITEM值为空,但是在项目0005之后显示项目0030,因为它是非常相似的项目,并且行中提到了项目编号项目0005。 之后需要返回记录集指针以继续加载它跳过的位置的结果(项目0006)。

一旦记录集到达0030,我希望它跳过此记录,因为它已经被用户看到并且之前已经加载过。

2 个答案:

答案 0 :(得分:1)

这似乎可以完成这项工作 - 您需要将表连接回自身,并使用自连接优先于通常的排序键:

declare @T table (ItemNo char(4) not null,Description varchar(20) not null,RelatedItemNo char(4) null)
insert into @T (ItemNo,Description,RelatedItemNo) values
('0001','0001',null),
('0002','0002',null),
('0003','0003',null),
('0004','0004',null),
('0005','0005','0009'),
('0006','0006',null),
('0007','0007',null),
('0008','0008',null),
('0009','0009',null),
('0010','0010',null)

select
    t.*
from
    @T t
        left join
    @T t_par
        on
            t.ItemNo = t_par.RelatedItemNo
order by
    COALESCE(t_par.ItemNo,t.ItemNo),
    t_par.RelatedItemNo

结果:

ItemNo Description          RelatedItemNo
------ -------------------- -------------
0001   0001                 NULL
0002   0002                 NULL
0003   0003                 NULL
0004   0004                 NULL
0005   0005                 0009
0009   0009                 NULL
0006   0006                 NULL
0007   0007                 NULL
0008   0008                 NULL
0010   0010                 NULL

这不适用于项目显示为多个其他行的RelatedItemNo的情况 - 它会出现在每个这样的位置。但是,再一次,你没有在你的问题中提到这种可能性,也没有提到处理它的具体规则,所以我不会为此添加任何修复。

另外,如果我们需要将其扩展到多个级别,上述内容仍然不足 - 可通过引入CTE来解决。但是,在你的问题中,你还没有提到过这种情况。

答案 1 :(得分:0)

根据您的SQL Server版本,您可以在表中添加hierarchyid列并对其进行排序。

或者,您可以编写递归CTE来订购结果。