Witam, mam takie tabele i zapytanie:
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)
  1. SELECT nss.*, to_char(nss.send_date, 'DD.MM.YYYY') AS send_date,
  2. (
  3. SELECT array_to_string(array_agg(nssc.email || customer.name), '; ')
  4. FROM newsletter_send_save_customer AS nssc
  5. LEFT JOIN customer ON customer.idcustomer = nssc.idcustomer
  6. WHERE nss.idnewsletter_send_save = nssc.idnewsletter_send_save AND nss.idnewsletter_send_save=nssc.idnewsletter_send_save
  7. ) AS emails
  8. FROM newsletter_send_save AS nss
  9. 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:
  1. (
  2. SELECT array_to_string(array_agg(nssc.email || ' ' || customer.firstname || ' ' || customer.name), '; ')
  3. FROM newsletter_send_save_customer AS nssc
  4. INNER JOIN customer ON customer.idcustomer = nssc.idcustomer
  5. WHERE nss.idnewsletter_send_save = nssc.idnewsletter_send_save AND nss.idnewsletter_send_save=nssc.idnewsletter_send_save
  6. ) AS emails_customer,
  7. (
  8. SELECT array_to_string(array_agg(nssc.email), '; ')
  9. FROM newsletter_send_save_customer AS nssc
  10. WHERE nss.idnewsletter_send_save = nssc.idnewsletter_send_save AND nssc.idcustomer IS NULL
  11. ) AS emails
  12. FROM newsletter_send_save AS nss
  13. 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.