n° 186
Luglio/Agosto 2013
Giugno 19, 2013, 06:55:00 am *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  

* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Query che mi sta facendo innervosire, aiuto  (Letto 734 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
Abdujaparov
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 9


Mostra profilo
« inserita:: Agosto 27, 2005, 03:55:55 pm »

Salve a tutti ho un problema nello scrivere una query che coinvolge 3 tabelle.
Le tabelle sono queste: ordine, installazione, ordinefornitore. La chiave primaria di ordine è idordine che è una chiave esterna delle altre due tabelle che hanno (ognuna) una colonna ordine in cui deve essere inserito un idordine.
Ora io vorrei ottenere gli ordini che sono presenti in ordinefornitore ed hanno dataRicezione non a null ma non sono presenti in installazione. Ho provato a scrivere la query in questo modo:

1)SELECT r.* FROM ordinefornitore o, ordine r, installazione i WHERE o.ordine=r.idordine AND o.ordine!=i.ordine AND o.dataRicezione IS NOT NULL

Però questa query non funziona mi vengono ritornati più volte (vengono ripetuti) gli ordini che trovo con questa query:

2)SELECT r.* FROM ordinefornitore o, ordine rWHERE o.ordine=r.idordine AND o.dataRicezione IS NOT NULL

questa query funziona ma non mi interessa. Io vorrei che dai risultati (corretti) della query 2 venissero tolti gli ordini presenti in installazione.

Come posso fare?
Grazie, ciao ciao.
Registrato
tjqblackdragon
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 16


Mostra profilo
« Risposta #1 inserita:: Ottobre 16, 2005, 08:33:46 pm »

Ciao una soluzione potrebbe essere quella di usare una stored procedure, questo tuttavia è possibile solo a partire da MySQL 5.0!
Una soluzione possibile sarebbe la seguente:
1. creare una tabella chiamata myId
Codice:

create table myId (id int unsigned not null primary key);

2. creare la seguente stored procedure
Codice:

create procedure getOrdini()
begin    
    declare ordinefornitore int unsigned;
    declare dataric date;
    declare ordineinstallazione int unsigned;
   
    declare eof int default 0;            
    declare eofB int default 0;
    declare flag int default 0;
   
    declare curFornitore cursor for select idordine, dataricezione from ordini.ordinefornitore;
    declare curInstallazione cursor for select idordine from ordini.installazione;
    declare continue handler for sqlstate \'02000\' set eof=1; #handler che intercetta la fine di un recordset
     
    delete from ordini.myId where id is not null; #elimina tutti i record present in myId
   
    open curFornitore;
    repeat
        set flag=0; # 0 se l\'ordine non è presente in ordinefornitore altrimenti 1
        set eof=0;
        open curInstallazione;
       
        fetch curFornitore into ordinefornitore, dataric;
        set eofB=eof;        
        repeat
            fetch curInstallazione into ordineinstallazione;            
            if ordinefornitore = ordineinstallazione then                
                set flag=1;
                set eof=1;
            end if;
        until eof end repeat;            
       
        if flag = 0 then
            if dataric is not null then                
                insert into ordini.myId values (ordinefornitore);
            end if;
        end if;
        close curInstallazione;
        set eof=eofB;
    until eof end repeat;
    close curFornitore;
end

3. per ottenere gli id desiderati eseguire le seguenti istruzioni:
Codice:

call getOrdini();
select ordine.* from ordine, myId where ordine.idordine = myId.id;


n.b. per inserire una procedura in mysql si può salvare il codice della procedura in un file qualsiasi, ad esempio getOrdini.sql, e poi una volta avviato il client di mysql digitiare:
Codice:

delimiter //
\\. \\getOrdini.sql
delimiter ;

Il comando delimiter serve per modificare il delimitatore di fine istruzione!
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2011 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page