Есть ли способ дублировать строку? - PullRequest
0 голосов
/ 06 декабря 2018

Я хочу что-то, что работает противоположно COUNT, это похоже на обратный GROUP BY (SPLIT BY?), Но вы можете работать с ним более свободно.

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

Любой способ, например, создать набор мощности или "экспоненциальное" перекрестное соединение "(каждая строка соединена с его копиями size_in_rows)?Или какая-то рекурсия?

Пример того, что мне нужно:

У меня есть таблица с парой полей, каждое из которых содержит информацию и целочисленное значение "count".Мне нужно ВЫБРАТЬ __ и отправить столько «счетных» копий одной и той же строки, чтобы прочитать ее одну за другой с другой программой вне базы данных.

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Вы не указали свою СУБД, но с PostgreSQL это действительно просто:

select t.*
from the_table t
  cross join generate_series(1, t.count)
order by t.id

Если предположить, что столбец первичного ключа таблицы называется id, то order by t.id сохраняет «дублированные» строки вместе.

0 голосов
/ 06 декабря 2018

Вот подход для SQL Server: Пример Fiddle

declare @rowToBeCopiedId bigint = 1
, @count int = 10

; with noRowsToInsertCte
(
    select 1 x
    where @count > 0
    union all
    select x + 1
    from noRowsToInsertCte 
    where @count > x
)
insert MyTable (col1, col2)
select col1, col2
from MyTable
cross join noRowsToInsertCte
where id = @rowToBeCopiedId

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

create view vMyTableWithCount as
with innerCte as 
(
    select id
    , col1
    , col2
    , cnt
    , 1 i
    from MyTable
    where cnt > 0

    union all

    select id
    , col1
    , col2
    , cnt
    , i + 1
    from innerCte
    where i < cnt
) 
select *
from innerCte

Для получения дополнительной информации см. пример скрипки .

0 голосов
/ 06 декабря 2018

Что-то вроде

SELECT * FROM T
UNION ALL
SELECT * FROM T WHERE count>1
UNION ALL
SELECT * FROM T WHERE count>2

должно привести вас туда, но быстро становится непрактичным, если вы хотите, чтобы сумасшедшие подсчеты тоже работали.

Еще кое-что: вы не конструируете множества, выконструирование сумок.У наборов не может быть дубликатов по определению.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...