Re: [postgresql-it] join con un campo alias

  • From: Daniele Varrazzo <piro@xxxxxxxxxxx>
  • To: <postgresql-it@xxxxxxxxxxxxx>
  • Date: Wed, 12 Dec 2012 10:51:27 +0100

On 2012-12-11 12:52, Roberto Marzialetti wrote:

ciao

ho due campi
- data_incasso
- stato_incasso_id -> FK tabella stati_incassi

(si, ho sbagliato lo schema del db...)

adesso vorrei eliminare il campo "stato_incasso_id" desumendolo da
"data_incasso", ma non vorrei fare troppi danni allo
schema/applicazione. quindi. pensavo di fare:

CASE
   WHEN data_incasso IS NULL
THEN 'DIN' ELSE 'ATC' -- che sono i valori nella tabella stati_incassi
END AS stato_incasso_id
INNER JOIN stato_incasso_id ON stati.stato_incasso_id

ma ovviamente non me lo fa fare...

Si può fare con una sottoquery, ma le possibilità di ottimizzazione della query che dai al database vengono ridotte di parecchio. I full scan della tabella sono quasi certi: se la tabella è grande può essere un problema. Avere il campo su cui fare il join esplicito è meglio.

Quello di sopra puoi farlo con la sottoquery con qualcosa tipo:

select ... from (
    select f1, f2,
      CASE WHEN data_incasso IS NULL
          THEN 'DIN' ELSE 'ATC' END AS stato_incasso_id) x
INNER JOIN stati_incassi s ON s.id = x.stato_incasso_id

o anche, meglio, un'espressione nel join:

select ... from tabella t
join stati_incassi t
on t.id = (case when data_incasso is null then 'DIN' else 'ATC' end);



pensavo quindi di usare tanti case quanti ne ho bisogno
[...]

ma non mi piace molto...

teribbile...


con un trigger?

Il trigger non ti serve sulla select, ma col trigger ci puoi mantenere stato_incasso_id in sincrono con data_incasso, che poi ti aiuta a usare il join in maniera naturale, che è la soluzione migliore.


--
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com

Other related posts: