Newsgroup: it.comp.lang.visual-basic
Titolo: DELETE SQL

Ho 2 tabelle  ( tabA , TAbB) con 2 campi in comune Anno e progressivo
voglio cancellare dalla tabB tutti i record che nella tabA abbiano data<
'31-12-2000' ma non i dati della TabA
facendo:
delete from tabB b ,tabA a where
A.anno =B.anno
and a.prog = B.progr 
and a.data < 31-12-2000'
ma cosi' non cancella anche i dati della tabA ??
grazie.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ma cosi' non cancella anche i dati della tabA ??
Si.
Se dici che vuoi cancellare da TabB e TabA e' lapalissiano che eliminerai da
entrambe i record che soddisfano certi requisiti.
E ancora 6 sicuro che la query sia corretta?
Il formato dell'istruzione DELETE e'
DELETE nometabella [WHERE nomecampo = qualcosa]
e se non specifichi alcuna clausola where l'intera tabella sara' svuotata.
Tu pero' fai presente che vuoi eliminare tutti quei campi in cui a.prog =
b.prog e a.anno = b.anno e a.data < 31.12.2000.
Per prima cosa li selezioni:
SELECT TabB.primaryKey FROM TabA, TabB WHERE .... ecc...
E questo tirera' fuori una marea di record a meno che non usi la clausola
DISTINCT per eliminare i record uguali.
Quindi la query completa e'
DELETE TabB WHERE TabB.primaryKey IN (SELECT DISTINCT TabB.primaryKey FROM
TabA, TabB WHERE .... ecc...)
Questo presuppone che la TabB abbia una chiave primaria.
Quindi la subquery SELECT DISTINCT estrarra' le chiavi primarie dei record
della tabella b che soddisfano i tuoi requisiti, la query principale
eliminera' tutti i record inclusi nell'insieme indicato nella clausola IN.
Ciau
Andrea

 TabA, TabB WHERE .... ecc...)
e' corretta la seguente?
 DELETE TabB b WHERE b.anno , b.progressivo IN (SELECT anno, progressivo
FROM
 TabA  WHERE  anno < 31-12-2000
grazie comunque dell'aiuto :-)


 grazie.
Guarda che una cosa del genere non la si può fare.
Non si può mettere in join una tabella durante una delete.
Al massimo puoi crearti una vista che ti esegua la join e
poi fai la delete sulla vista.
Sempre che tu stia usando msde o superiori ...
alternativamente devi dare sotto di script vb che si
recuperano un recordset e poi cancellano le righe
recuperato, passando una delete per ogni riga recuperata
dal precedente cursore.
-- 
Saluti
Andrea Moro
Sito Comune : 
http://www.it-lang-vb.net

 rox (
ro...@nospam.com
) ha scritto, tanto per cambiare ...
O alternativamente, fai una delete con l'istruzione in dove
la in confronta i suoi valori restituiti tramite una select secca
su di un campo solo, messo però in join secondo lo
standard ansi92 e non microsoft, quindi per intenderci niente
inner join ma from tabA, tabB.


 inner join ma from tabA, tabB.
cosi' e' corretto?
DELETE TabB b WHERE b.anno , b.progressivo IN (SELECT anno, progressivo
FROM
TabA WHERE anno < 31-12-2000
thx


 TabA WHERE anno < 31-12-2000
Non ho provato, credo identicamente a te.
Quel b.anno senza un condizione che la Where pretende (tranne forse
intenderla implicitamente come <>0), che ci fa?
Qualla data scritta cosě non va bene a niente e a nessuno, lo giuro.
Per Access: #MM/GG/AAAA#, per SQL Server: 'AAAAMMGG'
Sě, cosě!

 [*rox* : 
ro...@nospam.com
] ha scritto:


non volevo essere sintatticamente fedele :-)
era per oracle e la data e' '31-DEC-00'  :-)))
Comunque il problema e' questo, io voglio non solo che il 
progressivo sia nella sub select ma ci sia anche l'anno...
se mi interessava solo il progressivo avrei scritto:
DELETE TabB b WHERE b.progressivo IN (SELECT progressivo
FROM
TabA WHERE anno < 31-12-2000
e cosi' mi sa che va bene..(o no?) ma se voglio anche l'anno????
aritenkiu :-)


 aritenkiu :-)
Non credo che sia possibile. Ho appena guardato la sintassi di T-SQL per SQL
Server, seppur velocemente, ma non credo che i campi da testare per una "IN"
possano essere piů d'uno.
Un artificio che funziona puň essere questo (ora la sintassi te la smazzi tu
:-P):
... Where anno + progressivo IN (Select anno+progressivo as pippo From ...
Where ...)
ovvero concatenare valori di piů campi per ottenerne uno solo.


Ci provo anch'io...sto cercando delle conferme fra l'SQL/Db2 e gli SQL usati
in ambiente Access/Sql Server... :-)))
delete from tabB B
where exists (select 1 (o qualunque campo se 1 non funziona) from tabA A
where
                    A.anno = B.anno and A.progr = B.progr and A.data <
'31-12-2000' )
Tralasciando il formato Data che non conosco... la sintassi dovrebb'essere
corretta e l'esecuzione, la più rapida...
Datemi conferma che la "Exists" funzioni anche qui da voi... :-)))
Saluti, Il Sora!!

 possano essere più d'uno.
credo sia possibile... comunque appena ho 
la conferma te lo faccio sapere :-)


 > > TabA WHERE anno < 31-12-2000
DELETE TabB b WHERE b.progressivo IN
(SELECT progressivo FROM  TabA WHERE anno < '31-DEC-00'  AND
TabA.anno=b.anno)
termoPilucco.

Vi ricopio il mio Post dall'altro Thread...
"Ci provo anch'io...sto cercando delle conferme fra l'SQL/Db2 e gli SQL
usati
in ambiente Access/Sql Server... :-)))
delete from tabB B
where exists (select 1 (o qualunque campo se 1 non funziona) from tabA A
where
                    A.anno = B.anno and A.progr = B.progr and A.data <
'31-12-2000' )
Tralasciando il formato Data che non conosco... la sintassi dovrebb'essere
corretta e l'esecuzione, la più rapida...
Datemi conferma che la "Exists" funziona anche qui da voi... :-)))"
-------
DELETE TabB b WHERE b.progressivo IN
(SELECT progressivo FROM  TabA WHERE anno < '31-DEC-00'  AND
TabA.anno=b.anno)
by Termopilucco
-----
Se questo funziona a livello SQL c'è un notevole risparmio, perchè la
SubSelect per ottenere i Records di A utilizza, spero, una chiave di ricerca
più completa....con la IN invece, si genera un Set di Record di A per ogni
record di B molto più ampio...
Inoltre la IN deve verificare ancora per ogni record l'uguaglianza, mentre
la Exists, per sua natura,  non si pone il problema dei contenuti...
Se cortesemente mi fate sapere se in questo "ambiente" l'opzione Exists è
applicabile ve ne sarò grato...
Saluti, Il Sora!!

A<

 thx
no.
DELETE FROM TABB WHERE B.A IN (
    SELECT A.A FROM TABA A, TABB B
    WHERE A.A = B.A AND A.B < '20010101')



Si... si può fare una delete con una join... scoperto da poco! Non so se sia
supportato da
tutti i db ma in access, sql server e sybase funziona:
DELETE Tabella1 FROM Tabella1, Tabella2 WHERE Tabella1.Campo =
Tabella2.Campo