Bạn cần GROUP BY id
và điều kiện về "nhiều đơn hàng" chuyển thành HAVING
mệnh đề (vì nó là một ràng buộc trên từng nhóm, không phải trên từng hàng riêng lẻ trong dữ liệu đầu vào). Việc tổng hợp được thực hiện với LISTAGG
.
with
test_data ( id, product, code ) as (
select 1, 'Apple' , 145 from dual union all
select 1, 'Grapes', 146 from dual union all
select 2, 'Orange', 147 from dual union all
select 2, 'Apple' , 145 from dual union all
select 2, 'Plum' , 148 from dual union all
select 3, 'Grapes', 146 from dual union all
select 3, 'Orange', 147 from dual union all
select 4, 'Grapes', 146 from dual union all
select 5, 'Orange', 147 from dual
)
-- End of test data (not part of the solution). Query begins below this line.
select id, listagg(code, ' | ') within group (order by id) as codes
from test_data
group by id
having count(*) > 1
;
ID CODE
-- ---------------
1 145 | 146
2 145 | 147 | 148
3 146 | 147
Tuy nhiên, trong Oracle 10, bạn không có LISTAGG()
. Trước Oracle 11.2, một cách phổ biến để có được kết quả tương tự là sử dụng các truy vấn phân cấp, giống như sau:
select id, ltrim(sys_connect_by_path(code, ' | '), ' | ') as codes
from (
select id, code,
row_number() over (partition by id order by code) as rn
from test_data
)
where connect_by_isleaf = 1 and level > 1
connect by rn = prior rn + 1
and prior id = id
and prior sys_guid() is not null
start with rn = 1
;
ĐÃ CHỈNH SỬA :
Nếu CODE lặp lại cho cùng một ID cần phải được "loại bỏ" trước, sau đó - sử dụng giải pháp thứ hai - cần thực hiện các thay đổi sau, cả trong truy vấn con trong cùng:
-
thay đổi
SELECT ID, CODE, ...
thànhSELECT
DISTINCT
ID, CODE, ...
-
thay đổi
ROW_NUMBER()
thànhDENSE_RANK()