customer - idcustomer, name, firstname
newsletter_send_save - idnewsletter_send_save, title, body (tabela na tytul i tresc newslettera)
newsletter_send_save_customer - idnewsletter_send_save, idcustomer, email (tabela na emaile i opcjonalnie! idcustomera)
SELECT nss.*, to_char(nss.send_date, 'DD.MM.YYYY') AS send_date, ( SELECT array_to_string(array_agg(nssc.email || customer.name), '; ') FROM newsletter_send_save_customer AS nssc LEFT JOIN customer ON customer.idcustomer = nssc.idcustomer WHERE nss.idnewsletter_send_save = nssc.idnewsletter_send_save AND nss.idnewsletter_send_save=nssc.idnewsletter_send_save ) AS emails FROM newsletter_send_save AS nss ORDER BY nss.send_date DESC
chciałbym w podzapytaniu wyciągnąć listę osób do których wysłano newsletter w takiej postaci: adres_email imie nazwisko; adres_email imie nazwisko; ... itd
jeśli dam (array_agg(nssc.email) oczywiście działa i zwraca mi maile, ale jak próbuje np. łączyć kolumny czyli nssc.email || customer.name to zwraca tylko te rekordy, których kolumna idcustomer nie jest null a ja chce wszystkie.
Jak to inaczej rozwiązać?
Dobra poradziłem sobie, nie wiem czy to jest optymalne ale działa:
( SELECT array_to_string(array_agg(nssc.email || ' ' || customer.firstname || ' ' || customer.name), '; ') FROM newsletter_send_save_customer AS nssc INNER JOIN customer ON customer.idcustomer = nssc.idcustomer WHERE nss.idnewsletter_send_save = nssc.idnewsletter_send_save AND nss.idnewsletter_send_save=nssc.idnewsletter_send_save ) AS emails_customer, ( SELECT array_to_string(array_agg(nssc.email), '; ') FROM newsletter_send_save_customer AS nssc WHERE nss.idnewsletter_send_save = nssc.idnewsletter_send_save AND nssc.idcustomer IS NULL ) AS emails FROM newsletter_send_save AS nss ORDER BY nss.send_date DESC
rozbiłem to na dwa podzapytania: jedno pobiera adresy email, imie i nazwisko dla emaili, które można powiązać z klientem, a drugie same adresy jesli idcustomer is null.