2016-10-04 1 views
1

Управление SQL Server Studio -SQL Как слить результаты 3 в одном результате

Как объединить во время цикла 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 
-------------------- 

Wanted Результат:

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 
-------------------- 
+2

просим пометить СУБД, в которой вы используете – TheGameiswar

+0

, вам не нужен цикл while. Просто используйте union и 'row_number()', чтобы сгенерировать уникальный номер по полному результату. –

+0

@a_horse_with_no_name Мне хотелось бы знать, как можно зацикливать ту же таблицу, пока вы не можете предложить руководство или объяснение? – Kapein

ответ

3

Вы можете использовать временную таблицу и добавьте к нему

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 
+0

Та же структура полей, которые я собираю? Пример: CREATE TABLE #FinalTable (int, string, string) – Kapein

+1

Я понял, что это позволило оператору SQL стать 30ms быстрее, чем раньше (32 мс раньше) теперь 2, спасибо за это! – Kapein

+0

Я выбираю использовать 'DECLARE FinalTable TABLE (ID int, Name Varchar (50), DataTypeID int)' и заканчивать 'SELECT * FROM FinalTable' – Kapein