Newsgroup: it.comp.appl.access
Titolo: query complicata?

c=campo
Da una tab_1
c1    c2
1     2, 4, 6
2
3
4
5
6
Ottenere tramite sql
c1    c2
1     2, 4, 6
2     2, 4, 6
3
4     2, 4, 6
5
6     2, 4, 6
Riscrivo i valori di c2, sempre in c2, solo dove c1 è uguale a uno dei
valori di c2.
Tabella in modo esteso:
c1   c2
1     2
1     4
1     6
2
3
4
5
6
tramite query
c1  c2
1    2
1    4
1    6
2    2
2    4
2    6
3
4    2
4    4
4    6
5
6    2
6    4
6    6
------------------------------------------
Ringrazio anticipatamente





Per risolvere questo caso, mi ricollego ad un tread 
precedente...
Devo dire che sono andato un po' per tentativi, alcuni anche 
fuorvianti
Mi sono permsso di rendere piu' significativo l'esempio
Pongo 
quindi che la tab_1 contenga i seguenti record (in forma compatta)


 


       
c1        c2
--------- 
---------
        
1         
2,4,6,8
        
2         
5
        
3         
1,5
        
4         

        
5         
6
        
6
        
7         

        
8         4,5


 


Estrazione base: escludo i casi c2 nulli.


 


select  distinct  A.c1 as p1,  A.c2 as p2
  
from  tab_1 A
 where  A.c2 is not null


 


       
p1        p2
--------- 
---------
        
1         
2,4,6,8
        
2         
5
        
3         
1,5
        
5         
6
        
8         4,5


 


Prima aggiunta: inverto le colonne c1 e c2 

        
select  distinct c2 as 
p1,  c1 as p2  
  from  tab_1 
 where  c2 is 
not null


 


       
p1        p2
--------- 
---------
        
1         
3
        
2         
1
        
4         
1,8
        
5         
2,3,8
        
6         
1,5
        
8         1


 


Seconda aggiunta: dei c2 "secondari" legati tramite il c1 individuato 

dal punto precedente. Es. l'1 si trova sulla riga del 3, prendo quindi 

tutti gli elementi di questa riga, cioe' il 5


 


select  distinct A.c2 as p1,  B.c2 as p2
  from  
tab_1 A, tab_1 B
 where  B.c1 = A.c1 
   and  
B.c2 <> A.c2


 


       
p1        p2
--------- 
---------
        
1         
5
        
2         
4,6,8
        
4         
2,5,6,8
        
5         
1,4
        
6         
2,4,8
        
8         2,4,6


 


Terza aggiunta: Aggiungo quei record che rimangono con c2 null, 
cioe'
tutti i c2 null tranne quelli che hanno qualche riferimento.


 


select  distinct  A.c1 as p1,  A.c2 as p2
  
from  tab_1 A
 where  A.c2 is null
   and  
A.c1 not in (
        select  
B.c2
          from  tab_1 
B 
         where  B.c2 = A.c1 
)


 


       
p1        p2
--------- 
---------
        7


 


Mettendo in union vengono esclusi i doppioni


 


    select  distinct c2 as p1,  c1 as p2 

      from  tab_1 
     
where  c2 is not null
union
    select  distinct 
A.c2 as p1,  B.c2 as p2
      from  tab_1 
A, tab_1 B
     where  B.c1 = A.c1 

       and  B.c2 <> 
A.c2
union
    select  distinct  A.c1 as 
p1,  A.c2 as p2
      from  tab_1 
A
     where  A.c2 is 
null
       and  A.c1 not in 
(
            
select  
B.c2
              
from  tab_1 B 

             
where  B.c2 = A.c1 )
union
    select  
distinct  A.c1 as p1,  A.c2 as p2
      
from  tab_1 A
     where  A.c2 is not 
null


 


       
p1        p2
--------- 
---------
        
1         
2,3,4,5,6,8
        
2         
1,4,5,6,8
        
3         
1,5
        
4         
1,2,5,6,8
        
5         
1,2,3,4,6,8
        
6         
1,2,4,5,8
        
7
        
8         1,2,4,5,6


 


 



Grazie 1000 (ed oltre), proverň subito.
Ulteriore grazie per l' approfondimento nella spiegazione
di tutti i passaggi.
A vedere il codice,
nel mio oggetto posso anche autorispondermi:
query complicata?  SI