Я использую ORACLE 11g. У меня есть такая таблица
col1 col2
john 1
david 2
root 3
baily 4
Я хочу, чтобы вывод, как в таблице ниже, печатал 1 строку несколько раз
col1 col2
john 1
david 2
david 2
root 3
root 3
root 3
baily 4
baily 4
baily 4
baily 4
Являются ли значения в col1
в вашей таблице ввода разными (уникальными)? Если да, было бы полезно упомянуть об этом. Если это не так, то не на 100% ясно, каков желаемый результат. Например, предположим, что входные данные состоят ровно из двух строк, каждая из которых содержит значения john, 3
. Каков желаемый результат в этом случае?
Я предположил, что вы используете Oracle 11g (т.е. приведенный ниже синтаксис SQL предназначен для Oracle)
Присоединение ваших данных к «таблице чисел» повторит каждую строку в соответствии со значением в col2. Например:
CREATE TABLE mytable(
col1 VARCHAR(5) NOT NULL PRIMARY KEY
,col2 INTEGER NOT NULL
);
INSERT INTO mytable(col1,col2) VALUES ('john',1);
INSERT INTO mytable(col1,col2) VALUES ('david',2);
INSERT INTO mytable(col1,col2) VALUES ('root',3);
INSERT INTO mytable(col1,col2) VALUES ('baily',4);
select col1, col2
from mytable t
inner join (
select 1 as n from dual union all
select 2 as n from dual union all
select 3 as n from dual union all
select 4 as n from dual
) n on t.col2 >= n.n
order by col2, col1
+-------+------+
| COL1 | COL2 |
+-------+------+
| john | 1 |
| david | 2 |
| david | 2 |
| root | 3 |
| root | 3 |
| root | 3 |
| baily | 4 |
| baily | 4 |
| baily | 4 |
| baily | 4 |
+-------+------+
Примечание: Сформировать необходимую «таблицу чисел» можно несколькими способами.
например используйте любую существующую таблицу с достаточным количеством строк в ней для ваших целей
select row_number() over(order by table_name) as n
from all_tables
n.n
, вероятно, будет работать, но это не кажется хорошей идеей. Лучше всего использовать другое имя / псевдоним для представления и для столбца.
С образцами данных, которые вы разместили
SQL> select * From test order by col2;
COL1 COL2
----- ----------
john 1
david 2
root 3
baily 4
запрос, который возвращает желаемый результат, может быть
SQL> select col1, col2
2 from test cross join table(cast(multiset(select level from dual
3 connect by level <= col2
4 ) as sys.odcinumberlist))
5 order by col2;
COL1 COL2
----- ----------
john 1
david 2
david 2
root 3
root 3
root 3
baily 4
baily 4
baily 4
baily 4
10 rows selected.
SQL>
Вы можете использовать иерархический запрос, предполагая, что значения имени (col1
) уникальны по всей таблице, например
SELECT *
FROM t
CONNECT BY level <= col2
AND PRIOR SYS_GUID() IS NOT NULL
AND PRIOR col1 = col1
ORDER BY col2
«SQL 11g» не существует. Скорее всего, вы используете Oracle 11g.