Dubbio su SQL

Ciauz! Parto a bomba: nella mia intranet c'e' un modulo che consente di fare le ricerche anagrafiche (in PHP su database di AS400 via ODBC) per codice, ragione sociale, città, nazione e PIVA...

La richiesta è di aggiungere anche una ricerca per e-mail...

Inizialmente ho impostato la ricerca sull'indirizzo e-mail generico (90% tipo " info@cippirimerlo.it  :2funny: "), e non è stato un problema...

Ma l'anagrafica di AS400 comprende anche una "tabella esterna" chiamata RUBRI che altro non è che una rubrica di riferimenti (da 1 a "n") per ogni codice cliente...

E qui sono nati i problemi... in pratica devo fare in modo che la ricerca si estenda anche alla rubrica, ma visualizzando solo i dati principali (poi c'e' un'altra sezione che visualizza i dettagli)...

in pratica la ricerca solo della mail generica funziona così:

SELECT     CODICE, 
            RAGIONESOCIALE, 
            CAP, 
            LOCALITA, 
            PROV, 
            EMAIL, 
            STATO 
FROM        CLIENTI
WHERE      EMAIL LIKE '*myne.it*'

ed è banale... viene poi visualizzato l'elenco dei clienti trovati, si clicca sul riferimento desiderato e si vedono i dettagli (tra cui anche la rubrica)

Ma se "*myne.it*" è presente nella rubrica e non nella mail generica?

La ricerca nella rubrica è così:

SELECT         CODICE
FROM          RUBRI 
WHERE        REMAIL LIKE '*myne.it*'
AND            TIPO = 'C'
GROUP BY   CODICE

TIPO indica se si tratta di una rubrica Clienti o Fornitori, mentre il raggruppamento è necessario perché se anche avessi 20 contatti per il cliente "X" il codice cliente sarebbe uno solo...

Ora io devo fare in modo che la ricerca si sviluppi in tutt'e due le tabelle dandomi un esito unico...

Ho provato così:

SELECT      DISTINCT 
           CLIENTI.CODICE, 
           CLIENTI.RAGIONESOCIALE, 
           CLIENTI.CAP, 
           CLIENTI.LOCALITA, 
           CLIENTI.PROV, 
           CLIENTI.STATO
FROM       CLIENTI, RUBRI
WHERE     CLIENTI.CODICE = RUBRI.CODICE
AND         RUBRI.TIPO = 'C'
AND        ( CLIENTI.EMAIL LIKE '*myne.it*' OR RUBRI.REMAIL LIKE '*myne.it*' )

Ma mi ritorna sempre un risultato vuoto (mentre lasciando o l'una o l'altra LIKE da sole, va tranquillamente, ma ovviamente facendo riferimento solo all'una o all'altra tabella)...

L'alternativa (se non riesco con un'unica query SQL) è quella di scorrere e confrontare due recordset aperti con PHP-odbc per verificare eventuali "doppi codici" e mostrarne solo uno... a tal proposito, però, non ho trovato funzioni odbc che consentano di effettuare una ricerca in un recordset già aperto...

(so di essere un po' OT, qui... ma chiedo venia...)

Non so se mi sono spiegato... spero proprio che qualcuno mi sappia dare uno spunto/idea...

Grazie e ciao a tutti!

Mauro

inviato 10 anni fa
myne.it
X 0 X

Una "mezza" soluzione l'ho trovata applicando la UNION SELECT:

SELECT DISTINCT CLIENTI.CODICE, 
                          CLIENTI.RAGIONESOCIALE, 
                          CLIENTI.CAP, 
                          CLIENTI.LOCALITA, 
                          CLIENTI.PROV, 
                          CLIENTI.STATO
FROM                 CLIENTI, RUBRI
WHERE              CLIENTI.CODICE = RUBRI.CODICE
AND                  CLIENTI.EMAIL LIKE '*myne.it*'

UNION select DISTINCT CLIENTI.CODICE, 
                          CLIENTI.RAGIONESOCIALE, 
                          CLIENTI.CAP, 
                          CLIENTI.LOCALITA, 
                          CLIENTI.PROV, 
                          CLIENTI.STATO
FROM                 CLIENTI, RUBRI
WHERE              CLIENTI.CODICE = RUBRI.CODICE
AND                  RUBRI.REMAIL LIKE '*myne.it*'

Così funziona dal punto di vista del risultato (ovvero ottenere un elenco di clienti che contengono il riferimento passato o nella mail generale in CLIENTI o nella mail della rubrica in RUBRI), ma ho comunque il problema (secondario) di non poter conteggiare correttamente il numero di righe coinvolte (ogni ricerca mostra una dicitura tipo "Trovati 32 clienti in 0.40 sec. per i criteri cercati:"), in quanto il conteggio delle righe di RUBRI potrebbe superiore ai codici individuati...

Inoltre, con questo sistema, non è possibile fare ricerche incrociate... per esempio è impossibile dire "cercami tutti i clienti che hanno la sede a Milano e che hanno la e-mail che finisce in *.it"... etc...

Se pertanto qualcuno ha comunque idee diverse...

Ciauz!

 :bye:

risposto 10 anni fa
myne.it
X 0 X

Secondo me dovresti cercare di scoprire come mai la query ;

SELECT      DISTINCT 
           CLIENTI.CODICE, 
           CLIENTI.RAGIONESOCIALE, 
           CLIENTI.CAP, 
           CLIENTI.LOCALITA, 
           CLIENTI.PROV, 
           CLIENTI.STATO
FROM       CLIENTI, RUBRI
WHERE     CLIENTI.CODICE = RUBRI.CODICE
AND         RUBRI.TIPO = 'C'
AND        ( CLIENTI.EMAIL LIKE '*myne.it*' OR RUBRI.REMAIL LIKE '*myne.it*' )

non ti produce risultati, visto che credo sia questa la strada più giusta.

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Secondo me dovresti cercare di scoprire come mai la query ;

[...]

non ti produce risultati, visto che credo sia questa la strada più giusta.

In effetti anche a me sembra strano... non ti dico quanto ci ho già picchiato la testa... Ma non vorrei che sia un mio limite di conoscenza sulle query per DB2 di IBM (AS400)... A regola dovrebbe essere una query SQL standard, ma ho avuto qualche difficoltà, agli inizi di questo progetto, con le query per DB2...

Devo vedere se riesco a documentarmi in maniera alternativa (ora lavoro usando la Guida on-line di IBM http://publib.boulder.ibm.com/infocenter/db2v7luw/index.jsp?topic=/com.ibm.db2v7.doc/cpsqlrv1/ibmsqlr03.htm che suppongo essere il miglior riferimento)...

Per ora ho "tamponato", ma non mi va giù... per esempio, come ho già detto, perdo qualunque riferimento per il conteggio del numero di righe...

Devo anche fare i conti con il "tempo disponibile"... appena trovo tempo cerco di riaprire il problema ed approfondire...

 :bye:

risposto 10 anni fa
myne.it
X 0 X

per debuggare una query ti consiglio di costruirla "a pezzi" ovvero di inserire nuove clausole o vincoli uno alla volta e vedere se i risultati che ottieni sono quelli che ti aspettavi.

Ti faccio notare che quella query usa il prodotto cartesiano per unire le tabelle (deve esserci almeno un record nella tabella RUBRI relativo a ciascun record della tabella CLIENTI altrimenti non verrà mostrato il record della tabella CLIENTI)

In alternativa puoi usare una LEFT JOIN

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda