есть ли способ дублировать строку?

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

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

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

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

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


person iaguitos    schedule 06.12.2018    source источник
comment
(1) Отметьте свой вопрос с помощью базы данных, которую вы используете. (2) Приведите конкретный пример с данными в таблице text в вопросе.   -  person Gordon Linoff    schedule 06.12.2018
comment
Вы можете использовать такую ​​функцию, как generate_series(), для создания множества строк на основе счетчика. Какая конкретная база данных?   -  person The Impaler    schedule 06.12.2018
comment
Было бы лучше, если бы вы предоставили набор примеров.   -  person Renz Dominique    schedule 06.12.2018
comment
В зависимости от БД вы можете использовать для этого рекурсивный CTE.   -  person JohnLBevan    schedule 06.12.2018


Ответы (3)


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

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

Дополнительную информацию см. в примере скрипта.

person JohnLBevan    schedule 06.12.2018

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

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

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

person a_horse_with_no_name    schedule 06.12.2018
comment
К вашему сведению: для SQL Server вы можете использовать аналогичный подход; см. этот пост, чтобы узнать, как реализовать generate_series там: stackoverflow.com/a/28400185/361842 - person JohnLBevan; 06.12.2018

Что-то типа

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

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

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

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

person Erwin Smout    schedule 06.12.2018