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.