我有一个可能很奇怪的问题,但我想在开发一个工作之前我会问。我在数据库中有一个表,其中包含“产品”数据,包括其数量如下:
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 |
这可能吗?
答案 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