|
|
|
|
Strumenti |
05-05-2016, 17:13 | #1 |
Senior Member
Iscritto dal: Jul 2004
Città: Roma
Messaggi: 2087
|
[SQL] Query SQL, join 3 tabelle, valori non trovati nella join
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!
__________________
[NAS] Synology 918+ [HDD] SHR1 - 4x8TB Seagate Ironwolf [PC]-Ali-Seasonic Focus 650W-MB-ASRock x570 Steel Legend-CPU-AMD Ryzen 5 3600-RAM-G.Skill Aegis 32GB (2x16) DDR4-3200-HD_S.O-980 Pro 500GB-HD Dati- 3x6TB WD Red CMR + 4x8TB Ironwolf + 2x3TB WD Green |
06-05-2016, 10:24 | #2 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2762
|
Puoi usare NOT IN in questo modo:
Codice:
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) In alternativa, ma seguendo lo stesso ragionamento, puoi usare EXCEPT Codice:
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 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) |
08-05-2016, 18:27 | #3 |
Member
Iscritto dal: Oct 2008
Messaggi: 241
|
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:
Codice:
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 |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:02.