สำหรับผู้ที่ต้องแก้ปัญหานี้โดยใช้ Oracle 9i (หรือก่อนหน้า) คุณอาจต้องใช้ SYS_CONNECT_BY_PATH เนื่องจาก LISTAGG ไม่พร้อมใช้งาน
ในการตอบ OP ข้อความค้นหาต่อไปนี้จะแสดง PID จากตาราง A และเชื่อมคอลัมน์ DESC ทั้งหมดจากตาราง B
SELECT pid, SUBSTR (MAX (SYS_CONNECT_BY_PATH (description, ', ')), 3) all_descriptions
FROM (
SELECT ROW_NUMBER () OVER (PARTITION BY pid ORDER BY pid, seq) rnum, pid, description
FROM (
SELECT a.pid, seq, description
FROM table_a a, table_b b
WHERE a.pid = b.pid(+)
)
)
START WITH rnum = 1
CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR pid = pid
GROUP BY pid
ORDER BY pid;
อาจมีอินสแตนซ์ที่คีย์และค่าทั้งหมดอยู่ในหนึ่งตาราง สามารถใช้แบบสอบถามต่อไปนี้เมื่อไม่มีตาราง A และมีเฉพาะตาราง B:
SELECT pid, SUBSTR (MAX (SYS_CONNECT_BY_PATH (description, ', ')), 3) all_descriptions
FROM (
SELECT ROW_NUMBER () OVER (PARTITION BY pid ORDER BY pid, seq) rnum, pid, description
FROM (
SELECT pid, seq, description
FROM table_b
)
)
START WITH rnum = 1
CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR pid = pid
GROUP BY pid
ORDER BY pid;
ค่าทั้งหมดสามารถจัดลำดับใหม่ได้ตามต้องการ สามารถเรียงลำดับคำอธิบายแบบต่อส่วนบุคคลใน PARTITION ตามข้อและรายการของ PID สามารถจัดเรียงใหม่ใน ORDER สุดท้ายโดยส่วนคำสั่ง
อีกทางเลือกหนึ่ง:อาจมีบางครั้งที่คุณต้องการเชื่อมค่าทั้งหมดจากตารางทั้งหมดลงในแถวเดียว
แนวคิดหลักที่นี่คือการใช้ค่าเทียมสำหรับกลุ่มของคำอธิบายที่จะต่อกัน
ในแบบสอบถามต่อไปนี้จะใช้สตริงคงที่ '1' แต่จะใช้ค่าใดก็ได้:
SELECT SUBSTR (MAX (SYS_CONNECT_BY_PATH (description, ', ')), 3) all_descriptions
FROM (
SELECT ROW_NUMBER () OVER (PARTITION BY unique_id ORDER BY pid, seq) rnum, description
FROM (
SELECT '1' unique_id, b.pid, b.seq, b.description
FROM table_b b
)
)
START WITH rnum = 1
CONNECT BY PRIOR rnum = rnum - 1;
สามารถเรียงลำดับคำอธิบายแบบต่อส่วนบุคคลใน PARTITION โดยข้อ
คำตอบอื่น ๆ อีกมากมายในหน้านี้ได้กล่าวถึงการอ้างอิงที่มีประโยชน์อย่างยิ่งนี้:
https://oracle-base.com/articles/misc/string-aggregation-techniques