Newsgroup: it.comp.www.asp
Titolo: query di eliminazione: COULD NOT DELETE FROM SPECIFIED TABLES

Ciao e grazie a chiunque mi voglia aiutare,
il mio problema è il seguente:
ho una pagina asp, dedicata alla gestione di date di concerti, che mi
dovrebbe eseguire la seguente query per l'eliminazione di tutte le
date più vecchie di un mese dal giorno corrente (nota bene che la data
nel db è salvata come stringa ed inserita nel formato AA/MM/GG) che
non sono state recensite (quindi con id = null, oppure categoria <> da
2 perchè possono esserci recensioni di album con lo stesso id del
concerto ma che sono distinte grazie alla categoria per l'appunto.):
DELETE tb_concerto.*, tb_concerto_gruppo.*
FROM (tb_concerto LEFT JOIN tb_recensione ON tb_concerto.id_concerto =
tb_recensione.a) LEFT JOIN tb_concerto_gruppo ON
tb_concerto.id_concerto = tb_concerto_gruppo.concerto
WHERE (((tb_concerto.data)<'04/03/10') AND
((tb_recensione.id_recensione) Is Null)) OR
(((tb_concerto.data)<'04/03/10') AND ((tb_recensione.categoria)<>2));
Per darvi un'idea del significato delle tabelle:
tb_concerto -> contiene le info riguardanti la data, tipo il luogo il
giorno ecc...
tb_concerto_gruppo -> ogni record è composto da una sua chiave
primaria, la chiave primaria del concerto e la chiave primaria di un
gruppo (i cui dati (nome, genere, bio, ecc) sono salvati in
un'ennesimo database)
ogni concerto può avere più gruppi associati
tb_recensione -> contiene dati relativi alla recensione (autore,
recensione, data, ecc) le recensioni possono essere oltre di concerti
anche di album.
nella tabella recensoni viene salvato solo l'id del concerto o
dell'album recensito nel campo tb_recensione.a
può capitare che album e concerto abbiano lo stesso id.
la cosa che differenzia nella tabella recensioni una allbum da un
concerto è il campo tb_recensione.categoria
Quando la categoria è = 2 si tratta di un concerto
Il mio problema è che la pagina asp non cancella alcun record e se
eseguo la query da access mi da il seguente errore:
COULD NOT DELETE FROM SPECIFIED TABLES
Però se trasformo la query di eliminazione in query di selezione la
query funziona e mi mostra i record che vorrei cancellare
Spero di essere stato chiaro al punto di avervi fatto capire il
problema e come potermi aiutare.
Grazie in ogni caso.
Sono bene accette anche soluzioni alternative altrettanto efficaci.

Utilizzare le relazioni in modo che eliminando un record concerto,
automaticamente vangono eliminati i record correlati in concerto_gruppo.
-- 
:: Massimiliano Mattei
:: Project Leader
:: EVA Group :: 
www.evagroup.net
:: Soluzioni extranet :: e-business :: corporate portal

 automaticamente vangono eliminati i record correlati in concerto_gruppo.
E' quello che ho cercato di fare, infatti se noterai ho inserito, una
left join tra tb_concerti e tb_concerti_gruppo.
Però probabilmente non ho capito bene il tuo suggerimento... 
Se fossi così gentile di essere un pò più preciso a livello di sql o
qualcosa comunue di più pratico...
Grazie mille in ogni caso

Hai ragione, scusami. Volevo dire di creare delle relazione all'interno del
DB con delle foreign keys e chiavi primarie, specificando che che
l'eliminazione dell'elemento con chiave primaria debba portare
all'eliminazione dei record correlati in altre tabelle.
In quel caso dovresti semplicemente eliminare i record dalla tabella
concerti.
Quale DB usi? Probabilmente Access.. non ricordo se access offre questa
possibilità ma spero di si :)


Ho verificato con Access e la cosa è fattibile.
Vai su strumenti / relazioni
Aggiungi le tabelle interessate allo schema.
Poi non fai altro che trascinare il campo con la chiave primaria (nella
tabella dei concerti) sulla tabella di congiunzione (concerti_gruppi),
specificando "integrità referenziale" ed "elimina record correlati a
catena".
Ciao


 Ciao
Si uso Access, so che non è un gran che ma va bene per le pretese del
mio sito prettamente amatoriale...
Grazie per la dritta, ora il problema di cancellare i record della
tb_concerti insieme a quelli della tb_concerti_gruppi l'ho risolto.
Rimane solo un particolare: le recensioni.
Per evitare di non cancellare i concerti recensiti, come puoi vedere
nell'SQL del primo post, io controllavo che non ci fosse relazione tra
i campi 
tb_concerto.id
 ->  tb_recensioni.a (a stà per "a chi ho fatto
la recensione") o se questa relazione c'era, visto che poteva capitare
che lo stesso id del concerto lo potesse avere un'album anche questo
recensito, che il campo tb_recensioni.categoria  fosse diverso da 2
(quindi non si tratta di un concerto ma di un'album con lo stesso id)
Posso fare tutto questo in un'unico passaggio o devo prima crearmi un
recordSet dei concerti che voglio cancellare (quindi una select con
tutte le relazioni e condizioni del caso, inclusa la clausula delle
recensioni sopra citata) e cancellare record per record le date in un
secondo step?
Non è per problemi di prestazioni, ma solo per sapere la soluzione
ottimale.
Grazie comunque per il prezioso aiuto.
p.s.
pura curiosità, ma le X all'inizio e alla fine di xMANIGHTx, stanno ad
indicare che sei straight edge?

Non so Access supporta le subquery... una soluzione sbrigativa (stasera sono
fuso) che mi viene in mente č questa:
DELETE FROM tb.concerti WHERE concerto_id = ...... condizione AND
concerto_id NOT IN(select ... e qui metti la select che richiama tutti i
concerti dove non c'č la recensione ecc.)
Se non va o Access non lo supporta magari domani troviamo qualcosa che sia
anche piů performante ;)
Le x del nick sono i gradi perchč questo č un nick nato con un videogioco di
guerra molti anni fa (Red Alert).
