Sql 如何根据列的值展开Oracle查询的结果
我在OracleDB上有一个表,有两列。我希望看到每一行的重复次数与第二列中存储的数字相同。该表如下所示:Sql 如何根据列的值展开Oracle查询的结果,sql,oracle,split,Sql,Oracle,Split,我在OracleDB上有一个表,有两列。我希望看到每一行的重复次数与第二列中存储的数字相同。该表如下所示: col1 col2 a 2 b 3 c 1 我想编写一个返回以下内容的查询: col1 col2 a 2 a 2 b 3 b 3 b 3 c 1 因此,col2中的值指示一行的重复次数。有没有一个简单的方法来实现这一点 谢谢 with src (col1, col2) as (
col1 col2
a 2
b 3
c 1
我想编写一个返回以下内容的查询:
col1 col2
a 2
a 2
b 3
b 3
b 3
c 1
因此,col2中的值指示一行的重复次数。有没有一个简单的方法来实现这一点
谢谢
with src (col1, col2) as (
SELECT 'a', 2 FROM DUAL UNION ALL
SELECT 'b', 3 FROM DUAL UNION ALL
SELECT 'c', 1 FROM DUAL
)
SELECT
src.*
FROM
src
JOIN (
SELECT LEVEL val FROM DUAL
CONNECT BY LEVEL <= (SELECT MAX(col2) FROM src)
) gen ON gen.val <= src.COL2
ORDER BY
src.col1
或者在Oracle 12中可以使用
with src (col1, col2) as (
SELECT 'a', 2 FROM DUAL UNION ALL
SELECT 'b', 3 FROM DUAL UNION ALL
SELECT 'c', 1 FROM DUAL
)
SELECT
src.*
FROM
src
CROSS APPLY (SELECT NULL FROM DUAL CONNECT BY LEVEL <= src.col2)
ORDER BY
col1;
这里有一个替代方案,我添加了一个额外的列,以显示其他列可以存在,假设col1是唯一的:
with src (col1, col2, col3) as (
SELECT 'a', 'b', 2 FROM DUAL UNION ALL
SELECT 'b', 'c', 3 FROM DUAL UNION ALL
SELECT 'c', 'd', 1 FROM DUAL
)
select col1, col2, col3
from src
connect by level <= col3
and prior col1 = col1
and prior sys_guid() is not null;
COL1 COL2 COL3
---- ---- ----------
a b 2
a b 2
b c 3
b c 3
b c 3
c d 1
如果您的桌子是a,则您还可以执行以下操作:
select a1.col1 , a1.col2
from a a1
join (select level col2 from dual
connect by level < ( select max(col2) + 1 from a)) a2
on a2.col2 between 1 and a1.col2
Oracle 11g R2架构设置:
问题1:
如果:col2中的值大于src表中的行数,则第一个查询不起作用;数字是否有差距;;或者如果有重复的数字。在前两种情况下,它将返回太少的行,而在第三种情况下,它可能返回太多的行,或者DBMS_RANDOM.VALUE不为NULL将在99.9999999%的时间内工作-但是,它返回相同值两次的可能性很小,然后您可能会在用户数据中获得ORA-01436:CONNECT BY loop,并且您将很难尝试这样做复制错误。先前的SYS_GUID不为NULL不受此影响。
CREATE TABLE test ( col1, col2 ) AS
SELECT 'a', 2 FROM DUAL
UNION ALL SELECT 'b', 3 FROM DUAL
UNION ALL SELECT 'c', 1 FROM DUAL
SELECT col1,
col2
FROM test t,
TABLE(
CAST(
MULTISET(
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL <= t.col2
)
AS SYS.ODCINUMBERLIST
)
)
| COL1 | COL2 |
|------|------|
| a | 2 |
| a | 2 |
| b | 3 |
| b | 3 |
| b | 3 |
| c | 1 |