使用SQL Server,如何从While循环返回列表,我应该使用While循环吗?

时间:2015-05-05 18:11:50

标签: sql-server

我有表A,列IdParentId。给定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中执行此语句时,如何获取返回值?

3 个答案:

答案 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即可获取父信息。

其他评论正在回答您的问题,但没有解决您的数据建模问题!

希望有所帮助!