【问题标题】:SQL How to merge 3 while statement results into one resultSQL如何将3个while语句结果合并为一个结果
【发布时间】:2016-10-04 07:23:54
【问题描述】:

SQL Server 管理工作室 -

如何在 while 循环中联合?

ParentID 是与 ChildID 的内在关系

WHILE EXISTS (SELECT ParentID FROM Table1)
    BEGIN 
        SELECT * FROM FinalTable WHERE FinalTableID = (SELECT c.ChildID FROM Table1 as c WHERE c.ChildID = (SELECT d.ChildID FROM Table1 as d WHERE d.ChildID = @MyCounter))
      IF(SELECT e.ParentID FROM Table1 as e WHERE e.ChildID = @MyCounter) IS NULL
        BREAK
      ELSE
      SET @MyCounter = (SELECT d.ParentID FROM Table1 as d WHERE d.ChildID = @MyCounter)
        CONTINUE
    END

此代码当前导致包含不同结果的多个行集合,是否可以将所有内容合并为一个完整的结果?

FinalTable 
-------------------------------
|     ID  Name  Text  ChildID
|  1  1   Foo1  Bar1  1
|  2  2   oof1  Bra1  1
|  3  3   ofo1  Rab1  1
--------------------------------

FinalTable 
--------------------
|     ID  Row2  Row3  ChildID
|  1  8   Foo2  Bar2  2
|  2  9   oof2  Bra2  2
|  3  10  ofo2  Rab2  2
--------------------

FinalTable 
--------------------
|     ID  Name  Text  ChildID
|  1  14  Foo3  Bar3  3
|  2  17  oof3  Bra3  3
|  3  19  ofo3  Rab3  3
--------------------

想要的结果:

FinalTable 
--------------------
|     ID  Name  Text  ChildID
|  1  1   Foo1  Bar1  1
|  2  2   oof1  Bra1  1
|  3  3   ofo1  Rab1  1
|  4  8   Foo2  Bar2  2
|  5  9   oof2  Bra2  2
|  6  10  ofo2  Rab2  2
|  7  14  Foo3  Bar3  3
|  8  17  oof3  Bra3  3
|  9  19  ofo3  Rab3  3
--------------------

【问题讨论】:

  • 请标记您正在使用的 DBMS
  • 您不需要while 循环。只需使用联合和row_number() 即可在完整结果中生成唯一编号
  • @a_horse_with_no_name 我很想知道如何在没有 while 的情况下循环同一张表,您能否提出指导或解释?
  • @a_horse_with_no_name SQL Server 管理工作室,在页面顶部进行了编辑
  • childidparentid 来自哪里?它们不属于您展示的三个表格。

标签: sql sql-server tsql merge


【解决方案1】:

您可以使用临时表并附加到它

CREATE TABLE #FinalTable () -- should be same structure of FinalTable 
WHILE EXISTS (SELECT ParentID FROM Table1)
    BEGIN 
        INSERT INTO #FinalTable 
        SELECT * FROM FinalTable WHERE FinalTableID = (SELECT c.ChildID FROM Table1 as c WHERE c.ChildID = (SELECT d.ChildID FROM Table1 as d WHERE d.ChildID = @MyCounter))
      IF(SELECT e.ParentID FROM Table1 as e WHERE e.ChildID = @MyCounter) IS NULL
        BREAK
      ELSE
      SET @MyCounter = (SELECT d.ParentID FROM Table1 as d WHERE d.ChildID = @MyCounter)
        CONTINUE
    END

【讨论】:

  • 我收集的字段的结构相同吗?示例 : CREATE TABLE #FinalTable (int, string, string)
  • 我想通了,这使得 SQL 语句变得比之前快 30 毫秒(之前 32 毫秒)现在 2,谢谢!
  • 我选择使用 'DECLARE FinalTable TABLE (ID int, Name Varchar(50), DataTypeID int)' 并以 'SELECT * FROM FinalTable' 结束
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
相关资源
最近更新 更多