您可以拆分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
可以包含许多值,则由于性能原因,正则表达式的使用会有所变化,因此您必须使用MULTISET。