|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2004
Città: Roma
Messaggi: 2093
|
[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!
__________________
Case: Fractal Define 7 Ali: Seasonic Focus 650W MB: ASRock x570 Steel Legend CPU:AMD Ryzen 5 3600 RAM: G.Skill Aegis 32GB (2x16) DDR4 3200 GPU: Powercolor Radeon RX 5600XT Red Devil NVME SO:990 Pro 1TB + 990 Pro 2TB HDD Dati: WD HC580 24TB + WD HC560 20TB + EXOS X16 14TB Monitor: 3x Dell P2422H |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2773
|
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) |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Oct 2008
Messaggi: 303
|
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: 08:37.