插入/选择有序

时间:2018-01-09 03:59:30

标签: sql-server-2008

我有这样一张桌子:

create linkedList (
    id int identity(1, 1),
    parentId int not null, -- foreign key to table.id, always < this row's id
    name nvarchar(200)
)

我想将此表中的行插入:

create reportTable (
    id int,
    parentId int not null, -- foreign key to reportTable.id
    name nvarchar(200)
)

...但我只想插入一些行(确切的where条件不相关),我只想在插入父行时插入一行。

我可以通过使用游标来做到这一点,但有更好的方法吗?基本上我需要插入/选择从哪里可以控制插入顺序。如果我理解插入到它的ORDER BY并不能保证插入记录的顺序(所以我不能使用exists子句,因为我不能保证在插入之前插入父行。子)。

基本上我想要这样的东西:

INSERT INTO reportTable 
SELECT id, parentId, name
FROM linkedList
WHERE
    name = 'foo'
    and exists (select 1 from reportTable where id = linkedList.parentId)
OREDER BY id asc

...有没有一种简便的方法可以保证插入从最低的linkedList.Id到最高(由于存在条件这很重要)?

因为父记录可能有父记录,而父记录也是如此,如果父记录的名称是foo,我不能只检查exists子句,因为任何祖先都可能不符合这个要求)。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用递归CTE从子视角扩展层次结构(在这种情况下,锚点查询可能包括表中的所有记录,而递归部分会爬上层次结构到根目录)。这将为您提供每个孩子的完整祖先等级。理论上,您可以使用INSERT子句中的EXISTS来编写WHERE来过滤一个或多个父母符合您条件的子记录。

https://blog.sqlauthority.com/2012/04/24/sql-server-introduction-to-hierarchical-query-using-a-recursive-cte-a-primer/

请记住,以这种方式扩展层次结构可能会生成大量数据。根据表的大小,这可能不可行。