THEO Tôi vừa chạy ngang qua interesting article here này, cho thấy làm thế nào để mô phỏng wm_concat()
hoặc group_concat()
trong Oracle sử dụng một truy vấn và cửa sổ thứ bậc chức năng:Oracle CONNECT BY khoản sau mệnh đề GROUP
SELECT deptno,
LTRIM(MAX(SYS_CONNECT_BY_PATH(ename,','))
KEEP (DENSE_RANK LAST ORDER BY curr),',') AS employees
FROM (SELECT deptno,
ename,
ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) AS curr,
ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) -1 AS prev
FROM emp)
GROUP BY deptno
CONNECT BY prev = PRIOR curr AND deptno = PRIOR deptno
START WITH curr = 1;
Mặc dù, tôi tìm thấy điều này không phải là một giải pháp rất dễ đọc, nó khá thú vị, đặc biệt vì mệnh đề CONNECT BY .. STARTS WITH
đến sau mệnh đề GROUP BY
. Theo số the specification, điều này không thể thực hiện được. Tôi đã thử điều này bằng cách sử dụng một truy vấn đơn giản và nó hoạt động, mặc dù! Hai truy vấn sau trả về cùng một kết quả:
-- wrong according to the specification:
select level from dual group by level connect by level <= 2;
-- correct according to the specification:
select level from dual connect by level <= 2 group by level;
Đây có phải là tính năng không có giấy tờ không? Hay chỉ là sự thờ ơ cú pháp để thuận tiện? Hoặc làm hai câu lệnh tinh tế hành xử khác nhau?
Cảm ơn bạn đã nghiên cứu. Điều đó có ý nghĩa, tất nhiên. Sau khi tất cả, trong ký hiệu BNF, nó có thể khá khó khăn để tài liệu sự thờ ơ trật tự cho hai mệnh đề, như có thể thấy trong tài liệu [CONNECT BY .. START WITH/START WITH .. CONNECT BY] (http: // docs. oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#i2126079), nơi điều này trở nên khá khó đọc. –