我有表A,列Id
和ParentId
。给定Id
,我想返回所有ParentId
。
意思是,给定Id
,我想返回所有条目' ParentId
,然后我想查看录制的ParentId
是否作为ID输入到表中,如果是,我想找到它ParentId
等。 ..
例如,如果我有一个表的简单示例:
Id | ParentID
---+---------
1 0
2 1
3 2
4 3
5 4
6 5
7 6
我打印Id=7
的所有父母的查询如下所示:
DECLARE @ParentId INT;
SET @ParentId = 7;
WHILE(@ParentId > 0)
BEGIN
SELECT @ParentId = ParentId
FROM A
WHERE Id = @ParentID
PRINT @ParentId
END
此查询打印所有ParentId
。但是,有没有办法返回ID?在那里,如果我从PHP调用此查询,我想获得ParentIds的列表,但我的查询实际上没有返回任何内容。
此外,我想知道while循环是否是正确的解决方案。递归查询会更快吗?如果是这样,有关如何将其转换为递归查询的任何建议吗?
*编辑
我需要从PHP访问ParentIds列表。现在我尝试构建一个以逗号分隔的ID列表,以便从查询中返回,我稍后可以在PHP中进行解析。但是,以下查询给出了错误:
带有返回值的RETURN语句不能在此上下文中使用。
DECLARE @ParentId INT, @ParentList varchar(max);
SET @ParentId = 7;
WHILE(@ParentId > 0)
BEGIN
SELECT @ParentId = ParentId
FROM A
WHERE Id = @ParentID
SET @ParentList = @ParentList | CAST(@ParentId as varchar(20)) | ',';
END
RETURN @ParentList;
如何退回清单?另外,当我在PHP中执行此语句时,如何获取返回值?
答案 0 :(得分:1)
SELECT child.ParentID
FROM A child
INNER JOIN A parent
ON child.Id = parent.ParentID
结果
0
1
2
3
4
5
6
7
返回字符串列表
DECLARE @List NVARCHAR(MAX)
SELECT @List = COALESCE(@List + ',', '') + child.ParentID
FROM A child
INNER JOIN A parent
ON child.Id = parent.ParentID
SELECT @List
<强>结果强>
0,1,2,3,4,5,6,7
答案 1 :(得分:1)
在while循环之后返回ID的方法是创建表变量以将它们存储在进程中
declare @parents table
(
LVL int primary key identity(1,1), -- [optional] level in hierarchy
ParentID int
)
DECLARE @ParentId INT;
SET @ParentId = 7;
WHILE(@ParentId > 0)
BEGIN
SELECT @ParentId=ParentId
FROM A
WHERE Id=@ParentID
-- PRINT @ParentId
if (@ParentId > 0)
insert into @parents (ParentID) values (@ParentId)
END
select * from @parents
如果您想要递归查询,请尝试搜索recursive cte in sql-server
可以创建一个@parentList varchar(max)
变量并将结果作为字符串'6,5,4,3,2,1'
返回并在客户端进行拆分,但该格式在db
DECLARE @ParentId INT, @ParentList varchar(max) = '';
-- @ParentList should be initialized with non-NULL value
SET @ParentId = 7;
WHILE(@ParentId > 0)
BEGIN
SELECT @ParentId = ParentId
FROM A
WHERE Id = @ParentID
SET @ParentList = @ParentList + CAST(@ParentId as varchar(20)) + ',';
END
select @ParentList;
答案 2 :(得分:0)
只是一个建议,如果你可以创建和维护两个表(一个用于父项,一个用于子项),你可以利用两个数据集之间的关系。因此RDBMS中的R.如果你有3个父母,每个孩子有3个孩子,可能看起来像这样:
tblParents.ParentID
1 --Children are 1,2,3
2 --Children are 4,5,6
3 --Children are 7,8,9
tblChildren.ChildID, tblChildren.ParentID
1,1 --Parent 1's children
2,1
3,1
4,2 --Parent 2's children
5,2
6,2
7,3 --Parent 3's children
8,3
9,3
回到原来的问题。在这种情况下,如果您知道ChildID,则可以使用ParentID将Child和Parent表连接在一起。然后,您只需知道ChildID即可获取父信息。
其他评论正在回答您的问题,但没有解决您的数据建模问题!
希望有所帮助!