можете да разделите списъка с companies.legal_contacts
използвайки регулярен израз, след което присъединете резултантния набор с контакти, за да получите имейл адресите (присъединете се два пъти, за да получите ceo
поща също) и след това отново свържете имейлите с помощта на listagg
функция:
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;
ако companies.legal_contacts
може да съдържа много стойности, използването на регулярен израз се променя малко от съображения за производителност и трябва да използвате МУЛТИНАБОР.