Запрос, каждая строка была предоставлена ​​несколько раз во втором столбце (sql, oracle) - PullRequest
0 голосов
/ 28 марта 2012

дана таблица с двумя столбцами (1 - тип строки, другой - тип числа). Мне нужен запрос (с использованием команд: join и rownum), в котором каждой строке было указано количество раз, указанное для нее во втором столбце. например:

col1    col2
----    ----
apple   4
melon   1
banana  2

результат:

apple
apple
apple
apple
melon
banana
banana

Ответы [ 3 ]

1 голос
/ 28 марта 2012

Предполагая, что SQL Server, это возможно при разумном использовании таблицы подсчета (в этом примере используется sys.all_columns, размер которой является верхним пределом числа строк, которые могут быть сгенерированы) и вычислении частичных сумм для диапазоны индексов, что-то вроде этого:

;with Ranges as (
    select
        col1,
        (select coalesce(sum(t2.col2), 0)+1
            from MyTable t2 where t2.col1<t1.col1) as indexStart,
        (select coalesce(sum(t2.col2), 0)
            from MyTable t2 where t2.col1<=t1.col1) as indexEnd
    from
        MyTable t1
)
,TallyTable as (
    select
        row_number() over (order by c.object_id, c.column_id) as number
    from
        sys.all_columns c
)
select
    r.col1
from
    Ranges R, TallyTable T
where
    T.number between r.indexStart and r.indexEnd

Хотя, как указано в комментариях к ОП, это не рекомендуется, и вполне возможно, что есть лучшее решение вашей бизнес-проблемы.

0 голосов
/ 28 марта 2012

Поскольку вы не предоставили СУБД, я предполагаю PostgreSQL:

with test_data (col1, col2) as (
  values ('apple', 4), ('melon', 1), ('banana', 2)
) 
select col1 
from (
  select col1, generate_series(1, col2)
  from test_data
) t
0 голосов
/ 28 марта 2012

Предполагая, что вы используете SQL Server, использование рекурсивного CTE хорошо бы сработало

  • Выберите каждую строку из YourTable, добавив счетчик в набор результатов.
  • Выполняйте обработку по заданным столбцам, пока счетчик не достигнет значения в col2

Оператор SQL

;WITH q AS (
  SELECT  col1, cnt = 1
  FROM    YourTable
  UNION ALL
  SELECT  q.col1, cnt + 1
  FROM    q
          INNER JOIN YourTable yt ON yt.col1 = q.col1
  WHERE   cnt < yt.col2          
)  
SELECT  col1
FROM    q
OPTION  (MAXRECURSION 0)

Тестовый сценарий

;WITH YourTable(col1, col2) AS (
  SELECT 'apple', 4
  UNION ALL SELECT 'melon', 1
  UNION ALL SELECT 'banana', 2
)
, q AS (
  SELECT  col1, cnt = 1
  FROM    YourTable
  UNION ALL
  SELECT  q.col1, cnt + 1
  FROM    q
          INNER JOIN YourTable yt ON yt.col1 = q.col1
  WHERE   cnt < yt.col2          
)  
SELECT  col1
FROM    q
OPTION  (MAXRECURSION 0) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...