Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何根据列的值展开Oracle查询的结果_Sql_Oracle_Split - Fatal编程技术网

Sql 如何根据列的值展开Oracle查询的结果

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 (

我在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 (
    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 |