Newsgroup: it.comp.lang.visual-basic
Titolo: consiglio su query o procedura

Ciao a tutti,
chiedo per avere un consiglio sulla strada migliore per implementare 
quanto segue.
Ho tre coppie di tabelle, ciascuna costituita dalla solita relazione 
master/detail. Ogni riga della tabella detail della prima coppia è 
relazionata con una corrispondente nella seconda coppia. Lo stesso tra 
la seconda e la terza coppia.
Quindi qualcosa del genere dove le --> rappresentano le relazioni 
esistenti tra le righe delle tabelle detail.
TABELLA A --> TABELLE B --> TABELLA C
In ciasun record di queste tabelle detail ho un campo flag: se vale 1 la 
riga non è più significativa => la posso cancellare.
Vorrei cancellare in tutte e tre le coppie di tabelle i gruppi di record 
(costituiti dai collegamenti esistenti tra le varie tabelle) che hanno 
il flag = 1.
In pratica si tratterebbe di scorrere l'albero e verificare che in tutti 
i rami si incontrino solo flag = 1. La cosa è però costosa in termini di 
scrittura del codice e di tempo di esecuzione.
Si riesce a semplificare il problema o a definirlo come query di 
eliminazione con opportuni criteri?
Grazie a chi mi fornisce qualche suggerimento!
Marco / iw2nzm

Marco Trapanese ha pensato forte :

Se hai impostato le corrette relazioni Primary/Foreign Key, puoi fare 
un Delete CASCADE.
Altrimenti puoi fare un DELETE con INNER JOIN delle tre tabelle.
Una cosa del tipo
DELETE
TABELLA1
INNER JOIN TABELLA2
ON TABELLA1.CHIAVE=TABELLA2.CHIAVEESTERNA
INNER JOIN TABELLA3
ON TABELL2.CHIAVE=TABELLA3.CHIAVEESTERNA
da adeguare al dbms con cui operi.
ciao
Alberto
-- 
A questo punto hanno trovato un muro,
un muro duro, molto molto duro,
che siamo noi.

Albe V° ha detto questo mercoledì :

ovviamente...
....
WHERE TABELLA1.FLAG=1
AND TABELLA2.FLAG=1
AND TABELLA3.FLAG=1
Ciao


 AND TABELLA3.FLAG=1
Ciao Alberto,
grazie della rapidissima risposta!
L'idea è interessante, solo una cosa non mi torna. Probabilmente mi sono 
espresso male io ma dovrei eseguire la cancellazione solo se TUTTE le 
righe detail (associate a una riga master) hanno flag = 1 in TUTTE e tre 
le coppie relazionate.
Spero di essermi spiegato meglio, se serve provo a fare un esempio.
La tua soluzione mi sembrerebbe ideale se non avessi il vincolo di 
verificare che flag = 1 per tutte le righe detail di ogni tabella 
associate alle rispettive righe master.
Grazie mille!
Marco / iw2nzm

Marco Trapanese ci ha detto :

Vediamo...
Scrivo a braccio, quindi dovrai poi verificarti la sintassi nel tuo 
dbms:
BEGIN TRAN
DELETE TABELLA1
WHERE TABELLA1.CHIAVE NOT IN
    (SELECT TABELLA1.CHIAVE
     FROM TABELLA1
     INNER JOIN TABELLA2
     ON TABELLA1.CHIAVE=TABELLA2.CHIAVEESTERNA
     INNER JOIN TABELLA3
     ON TABELLA2.CHIAVE=TABELLA3.CHIAVEESTERNA
     WHERE TABELLA1.FLAG=0
       OR TABELLA2.FLAG=0
       OR TABELL3.FLAG=0)
DELETE TABELLA2
WHERE TABELLA2.CHIAVE IN
    (SELECT TABELLA2.CHIAVE
     FROM TABELLA2
     LEFT OUTER JOIN TABELLA1
     ON TABELLA1.CHIAVE=TABELLA2.CHIAVEESTERNA
     WHERE TABELLA1.CHIAVE IS NULL)
DELETE TABELLA3
WHERE TABELLA3.CHIAVE IN
    (SELECT TABELLA3.CHIAVE
     FROM TABELLA3
     LEFT OUTER JOIN TABELLA2
     ON TABELLA2.CHIAVE=TABELLA3.CHIAVEESTERNA
     WHERE TABELLA2.CHIAVE IS NULL)
COMMIT TRAN
Poi, forse si potrebbe fare con una unica DELETE, ma visto che tanto in 
un Adodb.Command puoi metterci dentro N statement in sequenza, il 
problema non si pone.


 COMMIT TRAN
Apperò! Io non riuscirei nemmeno a immaginare una query così... e questo 
la dice lunga su quanto devo ancora imparare :(
Domani provo la soluzione che mi hai proposto!
Grazie ancora :)
Marco / iw2nzm