我有一个在线商店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,我希望它跳过此记录,因为它已经被用户看到并且之前已经加载过。
答案 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来订购结果。