我想在下表中运行,每次都要处理不同的组。第一次处理3,4,5
的{{1}}个孩子,然后是group 1
的{{1}},然后是8
的{{1}}。
我尝试使用 CURSOR ,但我没有设法让每次都有不同的群体。
重要:我必须按照它们出现的顺序处理这些组,即组#1,然后是#4,然后是#3
已更新
group 4
我使用的查询是
6,7
谢谢
答案 0 :(得分:4)
除非您指定ORDER BY。
,否则SQL Server不保证记录的顺序即使将它们直接插入表中并将其读回,平行度,存储注意事项,索引和各种(我的技术术语)也可能导致它们以不同的顺序被回读。
这并不意味着您每次都会得到不同的订单,只是在没有ORDER BY的情况下您无法保证订单。
在您的情况下,这意味着您需要另一列来说明数据的插入顺序。这样做的一个简单方法就是在桌面上创建一个IDENTITY列。插入数据的顺序将保留在该列中,您可以在ORDER BY中使用它。
答案 1 :(得分:0)
您可以使用排名函数RANK()
和ROW_NUMBER()
以及ORDER BY
子句来阐明结果的顺序。
SELECT parent, child,
RANK() OVER (ORDER BY parent) [group],
ROW_NUMBER() OVER (PARTITION BY parent ORDER BY child) [item]
FROM t1
ORDER BY parent, child
答案 2 :(得分:0)
此脚本将完全返回我需要的内容。它以1,4,3的顺序返回组,而不是1,3,4 脚本和结果如下。
declare @tbl table (
id int identity(1,1) not null,
parent int null,
child int null);
WITH t1 (parent, child)
AS
(
SELECT Parentid, Id
FROM mytable
WHERE ParentId = 1 and Id <> ParentId
UNION ALL
SELECT Parentid,Id
FROM mytable t2, t1
WHERE t2.ParentId = t1.child
)
insert into @tbl(parent, child)
SELECT parent,child
FROM t1
select id, parent
from (select max(id) as id, parent
from @tbl
group by parent) t
order by t.id
结果
id parent
----------- -----------
3 1
4 4
6 3
答案 3 :(得分:0)
您可以使用MIN
分组功能按父母在序列中首次出现的顺序对父母进行排序。像ROW_NUMBER()
或RANK()
这样的排名函数将获得每个父级的序数位置。
SELECT parent,
RANK() OVER (ORDER BY MIN(id)) [ranking]
FROM t1
GROUP BY parent
ORDER BY [ranking]