Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle 12:Join auf kommaseparierter Liste?

Sie können die Liste von companies.legal_contacts aufteilen Verwenden Sie reguläre Ausdrücke und verbinden Sie dann die Ergebnismenge mit Kontakten, um die E-Mail-Adressen zu erhalten (verbinden Sie sich zweimal, um ceo zu erhalten mail auch) und dann die E-Mails mit listagg neu verketten Funktion:

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;

wenn die companies.legal_contacts kann viele Werte enthalten, die Verwendung von regulären Ausdrücken ändert sich aus Leistungsgründen etwas und Sie müssen ein MULTISET verwenden.