2012-06-26 31 views
6

Tôi đã bảng này với các dữ liệu sauhàng Lặp lại dựa trên giá trị cột trong mỗi hàng



Job  Quantity Status Repeat  
1    100      OK     2  
2    400      HOLD   0  
3    200      HOLD   1  
4    450      OK     3  

Dựa trên các giá trị trong cột Lặp lại cho mỗi hàng, hàng sẽ được lặp đi lặp lại một lần nữa. Ví dụ cho công việc 1, giá trị lặp lại là 2, do đó công việc 1 nên lặp lại hai lần nữa.

Bảng kết quả nên càng dưới



Job    Quantity Status Repeat  
1      100       OK     2  
1      100       OK     2  
1      100       OK     2  
2      400       HOLD   0  
3      200       HOLD   1  
3      200       HOLD   1  
4      450       OK     3  
4      450       OK     3  
4      450       OK     3  
4      450       OK     3  

Ai đó có thể xin vui lòng giúp tôi ra với truy vấn này? am sử dụng oracle 10g

Trả lời

7

Giả sử bạn sẽ không tạo ra hơn 1000 hàng mỗi hàng:

with num as (select level as rnk from dual connect by level<=1000) 
select Job, Quantity, Status, Repeat, rnk 
from t join num on (num.rnk <= repeat) 
order by job, rnk; 

Dưới đây là một thử nghiệm: http://sqlfiddle.com/#!4/4519f/12

UPDATE: Như Jeffrey Kemp nói, bạn có thể "phát hiện" tối đa với một subquery:

with num as (select level as rnk 
      from dual 
      connect by level<=(select max(repeat) from t) 
      ) 
select job, quantity, status, repeat, rnk 
from t join num on (num.rnk <= repeat) 
order by job, rnk; 
+0

+1, ngoài ra, bạn có thể thay thế '1000' bằng truy vấn phụ để tìm giá trị tối đa để lặp lại. –

+0

u guys r awesome .. + 10..thanx .. – user991255

-1

Thay vì thực hiện thao tác này với truy vấn, bạn có thể lấy dữ liệu này trước trong bảng dữ liệu và thêm hàng vào bảng dữ liệu mới dựa trên giá trị lặp lại và sau đó liên kết bảng dữ liệu mới này.

7

Bạn có thể sử dụng một CTE đệ quy:

with cte(Job, Repeat, i) as 
     (
     select Job 
     ,  Repeat 
     ,  0 
     from YourTable 
     union all 
     select Job 
     ,  Repeat 
     ,  i + 1 
     from cte 
     where cte.i < cte.Repeat 
     ) 
select * 
from cte 
order by 
     Job 
,  i 

Live example at SQL Fiddle.

+0

Oracle chỉ giới thiệu đệ quy CTE (AKA subquery bao thanh toán) trong 11gR2. Alas OP nói rằng họ đang sử dụng 10g. – APC

+0

+1 từ tôi. Đó là một giải pháp tốt đẹp anyway. –

+0

Cảm ơn, nó hoạt động rất tốt. Tôi không hiểu CTE đệ quy mặc dù, tôi sẽ biết ơn nếu bạn có thể giải thích nó một chút. – Akbari

Các vấn đề liên quan