vous pouvez diviser la liste des companies.legal_contacts
en utilisant une expression régulière, puis rejoignez le jeu de résultats avec les contacts pour obtenir les adresses e-mail (joindre deux fois pour obtenir ceo
mail aussi) puis reconcaténer les e-mails en utilisant listagg
fonction :
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;
si le companies.legal_contacts
peut contenir de nombreuses valeurs, l'utilisation des expressions régulières change un peu pour des raisons de performances et vous devez utiliser un MULTISET.