| Precedente :: Successivo   | 
	
	
	
		| Autore | 
		Messaggio | 
	
	
		Crono Semidio
  
  
  Registrato: 24/03/05 15:12 Messaggi: 224 Residenza: Trieste
  | 
		
			
				 Inviato: 27 Mar 2007 17:38    Oggetto: Creare con SQL query basate su altre query | 
				     | 
			 
			
				
  | 
			 
			
				Ho un database Access contenente due query di visualizzazione di una tabella, la prima query mostra dei record che soddisfano certe condizioni mentre la seconda mostra tutti i record della tabella tranne quelli che sono stati già visualizzati dalla prima query, con le mie scarse conoscenze di SQL ho scritto le query come segue:
 
prima query
 
 	  | Codice: | 	 		  
 
SELECT Tabella.Campo1, Tabella.Campo2
 
FROM Tabella
 
WHERE (((Tabella.Campo1)="xyz") OR ((Tabella.Campo1)="zxy"));
 
 | 	  
 
seconda query
 
 	  | Codice: | 	 		  
 
SELECT Tabella.Campo1, Tabella.Campo2
 
FROM Tabella
 
WHERE ((((Tabella.Campo1)="xyz") OR ((Tabella.Campo1)="zxy"))=FALSE);
 
 | 	  
 
questo esempio semplifica un pò le cose ma in realta la prima query è un elenco di query con condizioni diverse fra loro e la seconda contiene un elenco di condizioni troppo corposo per essere facilmente leggibile, mi servirebbe che qualcuno mi suggerisca come scrivere la seconda query senza copiare l'intero elenco delle condizioni della prima query ma, se è possibile, in modo simile a questo:
 
 	  | Codice: | 	 		  
 
SELECT Tabella.Campo1, Tabella.Campo2
 
FROM Tabella
 
WHERE (se un campo è già visualizzato dalla prima query non selezionarlo);
 
 | 	 
  | 
			 
		  | 
	
	
		| Top | 
		 | 
	
	
		  | 
	
	
		SverX Supervisor Macchinisti
  
  
  Registrato: 25/03/02 12:16 Messaggi: 11861 Residenza: Tokelau
  | 
		
			
				 Inviato: 27 Mar 2007 17:43    Oggetto: Re: Creare con SQL query basate su altre query | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Crono ha scritto: | 	 		  | come scrivere la seconda query senza copiare l'intero elenco delle condizioni della prima query | 	  
 
 
e copiandolo invece uguale uguale?
 
 
 	  | Codice: | 	 		  SELECT Tabella.Campo1, Tabella.Campo2 
 
FROM Tabella 
 
WHERE  Tabella.Campo1
 
NOT IN (qui la prima query) | 	  
 
 
(non sono un esperto neanche io, per quello farei così   ) | 
			 
		  | 
	
	
		| Top | 
		 | 
	
	
		  | 
	
	
		Crono Semidio
  
  
  Registrato: 24/03/05 15:12 Messaggi: 224 Residenza: Trieste
  | 
		
			
				 Inviato: 28 Mar 2007 09:43    Oggetto:  | 
				     | 
			 
			
				
  | 
			 
			
				| Purtroppo non funziona, magari fosse così facile | 
			 
		  | 
	
	
		| Top | 
		 | 
	
	
		  | 
	
	
		chemicalbit Dio maturo
  
  
  Registrato: 01/04/05 18:59 Messaggi: 18597 Residenza: Milano
  | 
		
			
				 Inviato: 28 Mar 2007 10:21    Oggetto:  | 
				     | 
			 
			
				
  | 
			 
			
				e  	  | Codice: | 	 		  | WHERE NOT (((Tabella.Campo1)="xyz") OR ((Tabella.Campo1)="zxy")));  | 	   oppure, per logica boleana,
 
 
 	  | Codice: | 	 		  | WHERE  ( NOT ((Tabella.Campo1)="xyz") AND NOT ((Tabella.Campo1)="zxy")) ) | 	  
 
?
 
 
nota bene: ci sto provando, io non so praticamente niente di SQL
 
 
p.s.:  	  | Crono ha scritto: | 	 		   	  | Codice: | 	 		  
 
WHERE (((Tabella.Campo1)="xyz") OR ((Tabella.Campo1)="zxy"));
 
 | 	  
 
seconda query
 
 	  | Codice: | 	 		  | WHERE ((((Tabella.Campo1)="xyz") OR ((Tabella.Campo1)="zxy"))=FALSE); | 	 
  | 	  Le parentesi non combaciano:
 
Manca un aparentesi chiusa (o c'è una parentesi aperta di troppo)
  L'ultima modifica di chemicalbit il 28 Mar 2007 14:16, modificato 1 volta | 
			 
		  | 
	
	
		| Top | 
		 | 
	
	
		  | 
	
	
		SverX Supervisor Macchinisti
  
  
  Registrato: 25/03/02 12:16 Messaggi: 11861 Residenza: Tokelau
  | 
		
			
				 Inviato: 28 Mar 2007 12:45    Oggetto:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Crono ha scritto: | 	 		  | Purtroppo non funziona, magari fosse così facile | 	  
 
 
effettivamente ho dimenticato che la select che metti nella clausola NOT IN deve selezionare solo Campo1, e non anche il 2... | 
			 
		  | 
	
	
		| Top | 
		 | 
	
	
		  | 
	
	
		disturbatore Semidio
  
  
  Registrato: 25/05/07 15:14 Messaggi: 278 Residenza: pianeta in corso di distruzione
  | 
		
			
				 Inviato: 25 Mag 2007 18:35    Oggetto:  | 
				     | 
			 
			
				
  | 
			 
			
				Ciao a tutti,
 
 
Crono, dalle nebbie delle mie reminescenze di SQL una soluzione potrebbe essere
 
 	  | Codice: | 	 		  
 
select T2.C1, T2.C2
 
  from Tabella T2
 
where not exists (select 1 
 
                               from Tabella T1
 
                             where <<qui tutte le clausole della prima query (ma con T1)>>)
 
 | 	  
 
 
La selection list della sub query può restare vuota (la costante 1) perchè l'azione della clausola "not exists" è solo di permettere o meno a un elemento selezionato dalla query esterna di permanere o meno nell'insieme risultato.
 
 
Si potrebbe fare lo stesso mettendo Tabella in join con se stessa, ma se il DBMS che usi la supporta, la clausola "not exists" mi sembra più elegante e probabilmente anche più efficente (ma dipende dall'interprete interno).
 
 
Spero che funzioni e che non sia troppo tardi...
 
 
A presto | 
			 
		  | 
	
	
		| Top | 
		 | 
	
	
		  | 
	
	
		 |