bạn có thể tách danh sách companies.legal_contacts sử dụng biểu thức chính quy, sau đó kết hợp tập hợp kết quả với các liên hệ để lấy địa chỉ email (tham gia hai lần để nhận ceo thư cũng vậy) và sau đó nối lại các email bằng cách sử dụng listagg chức năng:
SELECT co.company_id, p1.email, LISTAGG(p2.email, ', ') WITHIN GROUP (ORDER BY p2.email)
FROM (
SELECT DISTINCT company_id, ceo, REGEXP_SUBSTR(legal_contacts, '[^, ]+', 1, LEVEL) AS single_contact
FROM COMPANIES
CONNECT BY REGEXP_SUBSTR(legal_contacts, '[^, ]+', 1, LEVEL) IS NOT NULL) co
LEFT JOIN CONTACTS p1 ON co.ceo = p1.person_id
LEFT JOIN CONTACTS p2 ON co.single_contact = p2.person_id
GROUP BY co.company_id, p1.email;
nếu companies.legal_contacts có thể chứa nhiều giá trị, việc sử dụng biểu thức chính quy thay đổi một chút vì lý do hiệu suất và bạn phải sử dụng MULTISET.