Выбор одной и той же строки несколько раз - PullRequest
6 голосов
/ 07 июля 2011

У меня есть таблица, в которой есть несколько дочерних элементов главного объекта. Любой дочерний элемент может встречаться более одного раза, и существует столбец Occurences, содержащий это число, поэтому данные в таблице выглядят примерно так:

ChildID | ParentID | Occurences
-------------------------------
      1 |        1 |        2
      2 |        1 |        2
      3 |        2 |        1
      4 |        2 |        3

Мне нужно получить список всех дочерних элементов, при этом каждый дочерний элемент появляется в результате в основном количестве раз, что-то вроде

IDENT | ChildID | ParentID
--------------------------
    1 |       1 |        1
    2 |       1 |        1
    3 |       2 |        1
    4 |       2 |        1
    5 |       3 |        2
    6 |       4 |        2
    7 |       4 |        2
    8 |       4 |        2

Я могу сделать это с помощью курсора, который зацикливает таблицу и вставляет столько строк, сколько необходимо, но я не думаю, что это лучшее возможное решение.

Спасибо за помощь


Создание сценария включено:

DECLARE @Children TABLE (ChildID int, ParentID int, Occurences int)

INSERT  @Children
SELECT  1, 1, 2 UNION ALL
SELECT  2, 1, 2 UNION ALL
SELECT  3, 2, 1 UNION ALL
SELECT  4, 2, 3

Ответы [ 2 ]

7 голосов
/ 07 июля 2011
;with C as
(
  select ChildID,
         ParentID,
         Occurences - 1 as Occurences
  from @Children
  union all
  select ChildID,
         ParentID,
         Occurences - 1 as Occurences
  from C
  where Occurences > 0
)
select row_number() over(order by ChildID) as IDENT,
       ChildID,
       ParentID
from C
order by IDENT
4 голосов
/ 07 июля 2011
;WITH CTEs
AS
(
    SELECT 1 [Id]
    UNION ALL
    SELECT [Id] + 1 FROM CTEs WHERE [Id] < 100
)
SELECT ROW_NUMBER() OVER(ORDER BY c1.ChildID, c1.ParentID) [rn]
    , c1.ChildID, c1.ParentID
FROM CTEs ct
JOIN @Children c1 ON c1.Occurences >= ct.[Id]

Другой способ создания последовательности - использование предопределенной таблицы, например, master.dbo.spt_values:

SELECT ROW_NUMBER() OVER(ORDER BY c1.ChildID, c1.ParentID) [rn]
    , c1.ChildID, c1.ParentID
FROM master.dbo.spt_values ct
JOIN @Children c1 ON c1.Occurences > ct.number
    AND ct.type = 'P'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...