将行与Oracle数据库中的表中的行相乘的查询

时间:2016-06-16 16:50:19

标签: sql oracle oracle11g

我有一个可能很奇怪的问题,但我想在开发一个工作之前我会问。我在数据库中有一个表,其中包含“产品”数据,包括其数量如下:

NAME__|__SIZE______| QTY__
ITEM1 | LARGE      | 30
ITEM2 | MEDIUM     |  1
ITEM3 | SMALL      |  1
ITEM4 | EXTRA SMALL|  1
ITEM5 | 116        |  1

我已经构建了一个返回所有这些数据的查询,但是我需要为每个项返回一行,所以在这个例子中我的查询应该返回34行数据,其中30行的大小会很大。

所需的查询应返回:

NAME__|__SIZE______| 
ITEM1 | LARGE      | 
ITEM1 | LARGE      | 
ITEM1 | LARGE      | 
ITEM1 | LARGE      | 
...total 30 times...

ITEM2 | MEDIUM     |  
ITEM3 | SMALL      |  
ITEM4 | EXTRA SMALL|  
ITEM5 | 116        |  

这可能吗?

2 个答案:

答案 0 :(得分:1)

我猜你可以使用CTE。这些内容(例如在Postgresql上运行):

CREATE TABLE product(name text, size text, qty int);
insert into product values('ITEM1', 'LARGE', 5);
insert into product values('ITEM2', 'MEDIUM', 2);

WITH RECURSIVE temp(rn, name, size, qty) AS (
    SELECT 1, name, size, qty
      FROM product
    UNION ALL
    SELECT rn + 1, name, size, qty
      FROM temp
      WHERE rn < qty
)
SELECT name, size
  FROM temp
  ORDER BY name, size

输出:

name size
---- ----
ITEM1 LARGE
ITEM1 LARGE
ITEM1 LARGE
ITEM1 LARGE
ITEM1 LARGE
ITEM2 MEDIUM
ITEM2 MEDIUM

答案 1 :(得分:1)

Oracle安装程序

CREATE TABLE products ( NAME, SZ, QTY ) AS
SELECT 'ITEM1', 'LARGE',       10 FROM DUAL UNION ALL
SELECT 'ITEM2', 'MEDIUM',       1 FROM DUAL UNION ALL
SELECT 'ITEM3', 'SMALL',        2 FROM DUAL UNION ALL
SELECT 'ITEM4', 'EXTRA SMALL',  1 FROM DUAL UNION ALL
SELECT 'ITEM5', '116',          1 FROM DUAL;

查询1 - 使用分层查询

SELECT p.*
FROM   products p,
       TABLE( CAST( MULTISET ( SELECT 1 FROM DUAL CONNECT BY LEVEL <= p.qty )
                    AS SYS.ODCINUMBERLIST ) );

查询2 - 使用递归子查询分解条款

WITH rsqfc ( name, sz, qty, n ) AS (
  SELECT p.*, qty FROM products p
UNION ALL
  SELECT name, sz, qty, n-1 FROM rsqfc WHERE n > 1
)
SELECT name, sz, qty
FROM   rsqfc
ORDER BY NAME;

<强>输出

NAME  SZ                 QTY
----- ----------- ----------
ITEM1 LARGE               10 
ITEM1 LARGE               10 
ITEM1 LARGE               10 
ITEM1 LARGE               10 
ITEM1 LARGE               10 
ITEM1 LARGE               10 
ITEM1 LARGE               10 
ITEM1 LARGE               10 
ITEM1 LARGE               10 
ITEM1 LARGE               10 
ITEM2 MEDIUM               1 
ITEM3 SMALL                2 
ITEM3 SMALL                2 
ITEM4 EXTRA SMALL          1 
ITEM5 116                  1