Oracle 11g có chức năng LISTAGG gọn gàng này, khá nhiều thứ bạn muốn, tuy nhiên vì bạn đang ở trên 10g nên nó không khả dụng cho bạn (trừ khi bạn quyết định nâng cấp).
Nếu vì lý do nào đó mà bạn không muốn (hoặc không thể vì bất kỳ lý do gì) nâng cấp lên 11g, tôi khuyên bạn nên xem xét một số lựa chọn thay thế cho LISTAGG có sẵn cho bạn vào 10g.
Bạn có thể xem một số lựa chọn thay thế được đề xuất tại đây
Đã nhanh chóng điều chỉnh sự thích nghi nhanh chóng của một trong các giải pháp thay thế được đề xuất để phù hợp với tình huống trường hợp của bạn:
WITH Q AS
(
SELECT 'North' POD, 'Rony' NAME FROM DUAL UNION ALL
SELECT 'North', 'James' FROM DUAL UNION ALL
SELECT 'North', 'Aby' FROM DUAL UNION ALL
SELECT 'South', 'Sam' FROM DUAL UNION ALL
SELECT 'South', 'Willy' FROM DUAL UNION ALL
SELECT 'West', 'Mike' FROM DUAL
)
SELECT POD,
RTRIM(
XMLAGG (XMLELEMENT(e, name||',') ORDER BY name).EXTRACT('//text()'),
','
) AS name
FROM q
GROUP BY POD;
Nhưng hãy nhớ rằng đây không phải là giải pháp thực tế vì bạn sẽ phải điều chỉnh nó theo bảng của mình (không phải bảng KÉP giả), v.v ...
Giải pháp của bạn có thể sẽ giống như sau:
SELECT POD,
RTRIM(
XMLAGG (XMLELEMENT(E, NAME||',') ORDER BY NAME).EXTRACT('//text()'),
','
) AS NAME
FROM tbl1
GROUP BY POD;
Nếu bạn muốn thay đổi dấu phân cách, bạn có thể thay đổi nó từ dấu phẩy trong phần này:
(E, NAME||',')
RTRIM ở đó chỉ để cắt bỏ dấu phẩy ở cuối chuỗi được nối, nếu bạn không bị làm phiền bởi dấu phẩy ở cuối, bạn có thể bỏ qua hàm RTRIM để duy trì khả năng đọc.