Newsgroup: it.comp.appl.access
Titolo: Query e codice

c1=campo1
c2= campo2
Ho una tab1 con i seguenti record:
Tab_1
c1        c2
1          2
1          4
2          vuoto
3          vuoto
4          vuoto
I record con valore 1 hanno sul campo2   i valori 2, 4;
Quindi ho 3 valori: 1, 2, 4
Mi interessava creare una tabella, in cui fossero  presenti
i tre valori, ad esclusione ogni volta, di quello del record
corrispondente,
perché già presente nel campo1.
cioè
Tab_2
c1        c2
1         2
1         4
2         1
2         4
3         vuoto
4         1
4         2
Esiste un metodo, sia da query che da codice (ipotizzo che
si debba pima analizzzare il record n1 e poi con un ciclo,
caricare i successivi  creando eventualmente i nuovi record nella
tabella) ,
per risolvere il problema?
Mi interessavano entrambe le soluzioni.
Ciao e grazie

       Ciao e grazie
--
TiscaliNet, libero accesso ad Internet.
http://www.tiscalinet.it
-- 
Posted from 
twingo.tiscalinet.it
 [195.130.224.85] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Grazie mille
cerco di analizzare il codice per capirne il funzionamento
anche perchè l'esempio era semplificato al massimo
infatti io ho considerato tutti gli altri record sottostanti vuoti
Se invece ho dei valori che devo mantenere
allora l'esempio diventa:
Tab_1
 c1        c2
 1          2
 1          4
 2          5      n.b. ora il 2 ha un valore che devo mantenere
 3          vuoto
 4          vuoto
e  Tab_2
 c1        c2
 1         2
 1         4
 2         5      devo cioè mantenere un valore se già c'è
 2         1
 2         4
 3         vuoto
 4         1
 4         2
che posso anche scrivere per comodità così:
1               2, 4
2               5, 1, 4
3               vuoto
4               1, 2
chiaramente se in tab_1 al posto di 2   con il 5  avevo  2  con il 4
non serve in tab_2 riscriverlo perchè già esistente.
premetto che non so se  il codice vada ancora bene;
eventualmente come va integrato il codice per risolvere
una tabella impostata come sopra?
E' possibile inoltre vedere sul 2 campo tutti
i record che sono comunque relazionati direttamente o
indirettamente cioè:
da Tab_1
C1          C2
--1             2, 4, 6 ,8
--2             5
--3             1, 5
--4             7
--5             6
--6             niente
--7             3
--8             4, 5
(analisi dei primi 2 record)
devo avere in Tab_2
C1          C2
--1             2, 4, 6, 8, 5, 3, 7
(dentro parentesi i valori che prendo)
1  (1) ha il 2, 4, 6, 8, di partenza (2, 4, 6, 8).
1 sta anche col 5 sul 3 (5, 3)
dove il 3 sta sul 7 (solo il 7 perchè 3 già preso)
il 4 sta sul 7 (il 7 gia l'ho preso quindi niente)
il 4 sta con il 5 sull'8 (solo 8 prendo, il 5 già preso)
il 6 (6 lo prendo)
il 6 sta sul 5 già preso (niente)
l'8 (niente 8 già preso)
l' 8 ha il 4 e 5 già presi (quindi niente)
--2             1, 4, 6, 8, 5, 3, 7
per il 2 il lavoro di assegnazione dovrebbe essere più semplice
perchè mentre per l'1 sono andato alla ricerca di tutti i valori
ora siccome il 2 si trova nell'uno allora gli dò tutti
i valori del'uno e poi faccio la ricerca per quei valori dove l'1 non
ha preso i valori (perchè se li ha preesi li ho già dati al 2)
(sto ragionando in termini di Vb sigh!!!)
siccome dentro all'1 c'è anche il 5, che sarebbe stato il valore
da andare a tovare,allora, per il discorso fatto per il 2 dentro all'uno,
 non devo fare più nessuna ricerca.
etc....
Confronto completo:
Tab_1
C1          C2
--1             2, 4, 6 ,8
--2             5
--3             1, 5
--4             7
--5             6
--6             niente
--7             3
--8             4, 5
Tab_2
C1          C2
--1             2, 4, 6, 8, 5, 3, 7
--2             1, 4, 6, 8, 5, 3, 7
--3             2, 1, 4, 6, 8, 5, 7
--4             3, 2, 1, 4, 6, 8, 5, 7
--5             1, 2, 4, 6, 8, 3, 7
--6             1,2, 4, 8, 5, 3, 7
--7             1, 2, 4, 6, 8, 5, 3
--8             1, 2, 4, 6, 5, 3, 7
In  tab_2  quindi per ogni C1 ho in C2 tutti i possibili valori relazionati
direttamente e indirettamente.
P.s.
Sono partito da un esempio di base semplificato al massimo
per iniziare a comprendere come funziona la metodologia
di risoluzione.Pensavo che in sql non si poteva
risolvere avendo considerato nel post di partenza. per codice, un codice
che agiva direttamente aprendo la tabella e associando i record
a delle variabili (del tipo a matrice o vettoriale) e poi
dopo un gestione delle stesse riestrapolare i dati
da reinserire nei record.(forsè avevo pensato a questo perchè
ho un minimo ma proprio minimo di conoscenza di cicli for di Vb
e poca praticità di SQL)
Ma penso che comunque il lavoro sarebbe massacrante dovendo spostare
i valori dai record alle variabil e poi l'inverso etc. (sempreche si possa fare)
Piccola curiosità c'è un modo di poter vedere il codice di come agisce un sql
sulle tabelle:
cioè quando io applico ad esempio una clausola where ipotizzo che venga
aperta una tabella e siano fatti scorrere i record che poi sono confrontati con il valore
a destra dell'sql per agire di conseguenza.
Quindi grazie di nuovo
Spero che anche nelle ricerca di tutti i valori relazionati direttamente
o indirettamente l'SQL possa essere utile.

 direttamente e indirettamente.
Tutto questo mi fa pensare ad un algoritmo ricorsivo (realizzabile 
anche in VB), nel senso che per ogni valore di C1 devo trovare prima 
i valori in relazione diretta con C2 quindi per ogni valore di C2 
devo ripercorrere la colonna C1 per trovare eventuali altri valori in 
relazione indiretta e cosi' via... Il problema e': Quando mi fermo? 
Un algoritmo ricorsivo necessita di precise condizioni per non andare 
in loop. Non mi sembra banale.
Non ho fatto ulteriori indiagini, ma mi pare che nel caso di due 
colonne da porre in relazione nel modo da te descritto basta prendere 
tutte le combinazioni di valori in relazione *diretta* con una query 
che chiamiamo QUERY_1, questa estrae i singoli valori che hanno una 
relazione diretta in entrambi i sensi.
        select  distinct A.c1 
          from  tab_1 A
             ,  tab_1 B
         where  A.c1 = B.c2
            or  A.c2 is not null
Quindi incrocio tra di loro i valori appena ottenuti su un 
ipotetico piano cartesiano XY escludendo le relazione di un valore 
con con se stesso (X.c1<>Y.C2).
QUERY_1:
        select  X.C1 as C1, Y.C1 as C2
          from  QUERY_1 AS X
             ,  QUERY_1 AS Y
         where  X.C1 <> Y.C1
Aggiungiamo le relazioni da C1 a C2 in un sol senso
        select  C1, C2
          from  tab_1
         where  C2 not in ( select c1 from QUERY_1 )
Ed infine le relazioni da C1 a <niente> che devono rimanere solo se 
non esiste una relazione che coinvolge C1 di quelle già estratte.
        select  C1, NULL as C2
          from  tab_1
         where  C1 not in ( select c1 from QUERY_1 )
Se metti il tutto in una bella UNION, ho verificato che funziona per 
tutti e tre gli esempi che tu hai elencato.
        select  X.C1 as C1, Y.C1 as C2
          from  QUERY_1 AS X
             ,  QUERY_1 AS Y
         where  X.C1 <> Y.C1
         UNION
        select  C1, C2
          from  tab_1
         where  C2 not in ( select c1 from QUERY_1 )
         UNION
        select  C1, NULL as C2
          from  tab_1
         where  C1 not in ( select c1 from QUERY_1 )
L'importante e' fattorizzare il problema.
E' stato divertente.
__Matteo_Vitturi__
--
TiscaliNet, libero accesso ad Internet.
http://www.tiscalinet.it
-- 
Posted from 
laguna.tiscalinet.it
 [195.130.224.86] 


Ho usato il codice che mi hai postato ma dà errore
di sintassi nella proposizione della form
ho usato una tabella chiamata A
con campi c1 e c2
ed il seguente codice:
select * from
(select distinct A.c1 as CC1
from A, A as B
where A.c1=B.c2
or A.c2 is not null) as X,
(select distinct A.c1 as CC2
from A, A as B
where A.c1=B.c2
or A.c2 is not null) as Y
where CC1 <> CC2
UNION select CC1, NULL as CC2
from A
where CC1 not in (select distinct A.c1 as CC1
from A, A as B
where A.c1=B.c2
or A.c2 is not null);
però come già detto dà errore.
N.B. se hai già individuato l'errore puoi anche
non leggere tutte le righe sotto che sono solo dei tentativi
di scomporre il codice in tante sottoquery.
l'altro codice è ok
solo che mi interessava anche questo con l'aggiunta della
correzione del caso 2-5
Tentativi vari:
Ho provato così solo per vedere dove avevo gli errori.
Facendo solo questo pezzo come query1
select distinct A.c1 as CC1
from A, A as B
where A.c1=B.c2
or A.c2 is not null;
e questo come query2
select distinct A.c1 as CC2
from A, A as B
where A.c1=B.c2
or A.c2 is not null;
e poi una query 3
SELECT query1.cc1, query2.cc2
FROM query2, query1
WHERE query1.cc1<>query2.cc2;
funziona appunto la prima parte
e mi da
1         2
1         4
2         1
2         4
4         1
4         2
cioè senza il 3 e il null
poi ho fatto una query4
SELECT c1, null AS cc2
FROM AA
WHERE c1 not in Query1;
ma in apertura mi chiede
Immissione parametro query1
ammetto poi di non essere riuscito a creare
una query 5 di unione tra query 3 e query 4
ho fatto così ma non sono convinto
SELECT *
from query3
UNION select *
from query4;
ma da ancora maschera con immisione parametro query1
Comunque preferisco il codice tuo unico, però mi dà
l'errore  inerente la sintassi della form
In una ulteriore prova con il codice
select * from
(select distinct A.c1 as CC1
from A, A as B
where A.c1=B.c2
or A.c2 is not null) as X,
(select distinct A.c1 as CC2
from A, A as B
where A.c1=B.c2
or A.c2 is not null) as Y
where CC1 <> CC2;
dava sempre errore di sintassi form e visualizzava
il codice sql con il messaggio di errore e con una
evidenziazione nera bloccata sul secondo select
select * from
(select   si blocca qui e evidenzi aselect
ciao vedi anche le risposte all'altro post

tutte le combinazioni …..
        ciao e grazie
ps adesso ho capito perchè hai iniziato
specificando l'importanza vitale dell'SQL

Mi sono accorto che l'etichetta QUERY_1: e' al punto sbagliato... si
riferiva
ovviamente alla prima select... ma penso sia stato chiaro
Comunque, mi pare esista un teorema (non so ne' di chi ne' come si chiama)
che garantisce che "qualunque" algoritmo di estrazione dati si puo' ridurre
ad un'insieme appropriato di select / sub-select / union / group by ... ecc.
cioe' ad una istruzione SQL.
Ri-Ciao
__Matteo_Vitturi__
-- 
Posted from 
twingo.tiscalinet.it
 [195.130.224.85] 


 cioe' ad una istruzione SQL.
interessante il fatto che qualunque, ciò significa che l'SQl non ha limiti,
rimane il fatto che bisogna saperlo fare (purtroppo non è semplice sigh!!!,
ma rispetto al Vb più fattibile)
nell post precedene cosa intendevi per fattorizzazione?
Rispetto alla soluzione che trova tutte le relazioni dirette ed indirette dei
numeri,
come cambia l’SQL per avere solo le relazioni dirette ? cioè:
Da Tab_1:
Tab_1
c1            c2
---1           2, 4, 6, 8
---2           5
---3           1, 5
---4           7
---5           6
---6           niente
---7           3
---8           4, 5
Riassegno, per ogni valore in c1 che ho anche in c2, tutti i valori della riga
dove c1 si trova in c2
senza considerare le ripetizioni.
Devo Avere:
Tab_2
c1            c2
---1           2, 4, 6, 8, 3, 5
---2           5, 1, 4, 6, 8
---3           1, 5 , 7 , 3
---4           7, 1, 2, 6,  8, 5
---5           6, 2 , 3, 1, 8, 4,
---6           1, 2, 4,  8, 5
---7           3, 4
---8           4, 5, 1, 2, 6
Evidenzio i passaggi di assegnazione:
I numeri ripetuti nella riga non vanno riscritti
Tab_2
c1            c2
---1           2, 4, 6, 8     3, 1, 5
---2           5,                1, 2, 4, 6, 8
---3           1, 5             7 , 3
---4           7,                1, 2, 4, 6, 8                    8, 4, 5
---5           6                 2 , 5                3, 1, 5     8, 4, 5
---6                              1, 2, 4, 6, 8     5, 6
---7           3                 4,  7
---8           4, 5             1, 2, 4, 6, 8
Faccio un confronto considerando solo un record pieno:
Tab_1
c1            c2
---1        2, 4, 6, 8
---2  niente
---3        niente
---4  niente
---5  niente
---6        niente
---7        niente
---8        niente
devo aver tab_2:
Tab_1
c1            c2
---1        2, 4, 6, 8
---2  2, 4, 6, 8
---3        niente
---4  2, 4, 6, 8
---5  niente
---6        2, 4, 6, 8
---7        niente
---8        2, 4, 6, 8
questo modo di prendere i dati da c2 e rimetterli
nei valori di c1 che ho dal stesso va poi ripetuto
per gli tutti gli altri c1 (che hanno dei valori) e
quando rimetto i valori in c1, se ci sono già dei dati devo mantenerli
(e fare in modo di non avere valori doppi)
--------------------------------------------------------------------------------

 ---8        2, 4, 6, 8
n.b. questa è solo la procedura
di assegnazione (i numeri doppi poi non andranno considerati)
questo modo di prendere i dati da c2 e rimetterli
nei valori di c1 che ho da l  stesso, va poi ripetuto
per gli tutti gli altri c1 (che hanno dei valori) e
quando rimetto i valori in c1, se ci sono già dei dati devo mantenerli
(e fare in modo quindi di non avere valori doppi)
--------------------------------------------------------------------------