PDA

View Full Version : [SQL] Query SQL, join 3 tabelle, valori non trovati nella join


SaintTDI
05-05-2016, 18:13
Ciao a tutti,

nel titolo non sono riuscito a spiegarmi bene, nel post dovrei riuscirci.

Devo fare una query tra 3 tabelle.

Tabella A = Il group code da restituire che non hanno una promo associata
Tabella B = Associata alla tabella A tramite il group code
Tabella C = Associata alla tabella B, tabella delle promo

Questa query

select vo.GROUP_CODE
from cx_voucher vo, CX_PROMO_PROV pp, S_SRC pro
where
vo.GROUP_CODE = pp.X_PROVINCIA
and pp.PAR_ROW_ID = pro.row_id;

mi torna ovviamente tutti i Group code che hanno una promo associata.

Mentre io mi devo far tornare tutti i Group Code che NON HANNO una promo associata.

Come posso fare? Ovviamente non posso cambiare niente delle tabelle

grazie a tutti!

wingman87
06-05-2016, 11:24
Puoi usare NOT IN in questo modo:

select vo.GROUP_CODE
from cx_voucher vo
where
vo.GROUP_CODE NOT IN
(select vo.GROUP_CODE
from cx_voucher vo, CX_PROMO_PROV pp, S_SRC pro
where
vo.GROUP_CODE = pp.X_PROVINCIA
and pp.PAR_ROW_ID = pro.row_id)
La parte tra parentesi è la query che hai scritto tu

In alternativa, ma seguendo lo stesso ragionamento, puoi usare EXCEPT
select vo.GROUP_CODE
from cx_voucher vo
EXCEPT
select vo.GROUP_CODE
from cx_voucher vo, CX_PROMO_PROV pp, S_SRC pro
where
vo.GROUP_CODE = pp.X_PROVINCIA
and pp.PAR_ROW_ID = pro.row_id
Dove la query dopo EXCEPT è sempre la tua query.

Documentati un po' su questi due operatori perché ho letto che gestiscono in modo particolare i valori NULL e bisogna stare attenti (forse bisogna aggiungere qualche accorgimento alle query che ho scritto sopra)

GianMi
08-05-2016, 19:27
Non sono un esperto di SQL, ma mi pare che la soluzione migliore dal punto di vista delle performance sia una LEFT JOIN con il check sui NULL nella parte destra (dove appunto non fa il match). Una cosa del genere:


select vo.GROUP_CODE
from cx_voucher vo
left join CX_PROMO_PROV pp
on vo.GROUP_CODE = pp.X_PROVINCIA
inner join S_SRC pro
on pp.PAR_ROW_ID = pro.row_id
where pp.GROUP_CODE is null