Newsgroup: it.comp.software.database
Titolo: [SQL]Mi sono incartato su una query!!

Passo subito a un esempio pratico che non mi so spiegare :)
Date 3 tabelle
tab1(id_tab1) e tab2(id_tab2) e rel1(id_tab1,id_tab2)
tab1 contiene 1 2 3 4 5 6
tab2 contiene 1
rel1 contiene
id_tab1	     id_tab2	
    1 		1
    2 		1
    3 		1
Esiste che una query secca mi ritorni un risultato di questo 
tipo(vorrei sapere quali id_tab1 sono presenti e non 
presenti  dentro rel1):
id_tab1 id_tab2
    1	   1	
    2	   1	
    3       1
    4       null
    5	   null
    6	   null
non riesco a farla :( se era per un programma desktop lo 
farei via software, essendo sta cosa per un applicazione web 
mi sarebbe estremamente utilo riuscire a ottimizzare il 
tutto con una query e un ciclo e non una query un ciclo che 
esegue altre query intasando il server... :)
Ah ora uso mysql4/5 ma spero che esista una soluzione comune 
ai vari tipi di db.
Ciao && grazie per eventuali spunti!
 

    6    null
SELECT tab1.id_tab1, rel1.id_tab2 FROM
       tab1 LEFT JOIN rel1 ON tab1.id_tab1 = rel1.id_tab1;
HTH.
Alessandro
PS: ma tab2 a che serve? 

 PS: ma tab2 a che serve? 
Era per dar senso, ma effettivamente non ne da' piu' di tanto!:)
Ciao grazie mille per la risp! :)

 PS: ma tab2 a che serve? 
Aspeeee pero' forse ho capito, in realta' tab2 mi serve 
cazzarola!Nel db ci sono un fracco di dati e cio' mi ha 
incasinato la cosa!!
mettiamo che rel1 contiene
id_tab1     id_tab2
    1         1
    2         1
    1         2
SELECT tab1.id_tab1, rel1.id_tab2 FROM
         tab1 LEFT JOIN rel1 ON tab1.id_tab1 = rel1.id_tab1
	WHERE rel1.id_tab2=1;
il where mi incarta la query solo su 1 e 2... e giustamente 
mi sputa fuori  sta roba
id_tab1     id_tab2
    1         1
    2         1
quindi se faccio una roba di sto genere forse va
SELECT tab1.id_tab1, rel1.id_tab2 FROM
         tab1 LEFT JOIN rel1 ON tab1.id_tab1 = rel1.id_tab1
	WHERE rel1.id_tab2=1 OR rel1.id_tab2 is null;
ora provo! :D
ciao

 ora provo! :D
non va una sega! :( :( :(

    2         1
Non è che abbia capito un gran che, ad essere sincero. Magari se spieghi 
meglio cosa rappresentano le due (o tre) tabelle e cosa vuoi ottenere in 
realtà...
Alessandro 

 realtà...
sinceramente con sto esempio non ci capisco piu' niente 
neanchio...
Comunque e' una relazione molti-molti e tra 2 tabelle 
mettiamo che siano
prodotti e categorie e c'e' la tabella di relazione tra ste 
due... un prodotto puo' appartenere a 0 o piu' categorie.
Nell'applicativo l'utente seleziona un prodotto e sotto gli 
deve apparire l'elenco delle categorie a cui puo associarlo 
e mi serve pero' individuare a quali categorie e' gia' 
associato e a quali no.
prodotti
id_prod
categorie
id_cat
prodotti_categorie
id_prod0
id_cat
e se potessi ricavare un risultato di sto genere con una 
query sola sarebbe il top:
Per esempio seleziono prodotto 1 e dovrei lanciare una query
con il filtro sul prodotto con id_prod=1 e che mi ritorni 
elenco di tutte le categorie con l'informazione se quel 
prodotto fa parte o meno di quella categoria!
id_prod id_cat
    1      1	
    1      2
    1      null
    1      null
    1      null
Spero di essermi spiegato ma non credo! :)
Ciau

 WHERE rel1.id_tab2=1;
Perché una where su id_cat? Semmai "...WHERE rel1.id_tab1=1;".
Altrimenti continuo a non capire, scusa.
HTH.
Alessandro 

 Altrimenti continuo a non capire, scusa.
si e' corretto come dici te mi ero incasinato :)
cmq  non mi ritorna cio' che vorrei :(

 cmq  non mi ritorna cio' che vorrei :(
Preso da disperazione ho convertito quelle  3 tabelle dentro 
firebird e magia la query funziona! :(
Ma che sia l'accoppiata mysql+innodb a fare scherzi strani?
Aiuto!!!!

 PS: ma tab2 a che serve? 
ho trovato l'inghippo!!!
la query sopra non va se nella tabella di relazione i valori 
della colonna del campo di join coprono tutti i casi della 
tabella tab1 (in realta' dovrebbe fare il prodotto 
cartesiano ma non lo fa!!!!!)
Credo che la cosa che non mi permetteva di capire sta cosa 
sia nella sequenza delle operazioni che fa mysql:
*prima* fa la left join (che non riporta i nulli essendoci 
nella tabella di relazione una marea valori che coprivano 
tutti quelli della tab1) e *poi* esegue il where clause che 
giustamente non riportava i nulli.
Ho provato quindi a inglobare quella condizione nella join e 
cosi' mi ritorna anche i nulli... forse per quelli che usano 
mysql questa cosa e' scontata, ma a mio avviso questo e' un 
comportamento anomalo(che sia stato fatto per non far 
degradare le prestazioni della query???) in quanto nelle 
altre basi dati su cui ho lavorato entrambe le query 
avrebbero dato lo stesso risultato o almeno credo!!
Query che non riporta i nulli
SELECT * FROM  classi c
left join corsi_classi cc ON c.cls_cod=cc.cls_cod
WHERE cc.crs_cod=249
Query che riporta i nulli
SELECT * FROM  classi c
left join corsi_classi cc ON
(c.cls_cod=cc.cls_cod AND cc.crs_cod=249)
Ciao e grazie per le risposte! :)