Cancellazione record tramite query

di il
15 risposte

Cancellazione record tramite query

Ciao a tutti, 

ho un problema di questo tipo, nel mio database Access ho due tabelle UtentiPortale e Vecchi_Accessi_Portale; in pratica devo cancellare i record contenenti nella seconda tabella dalla prima;

ho fatto una query con il seguente codice, ma nel momento dell'esecuzione mi ritorna il messaggio che non è possibile cancellare i record, come mai? Qualcuno mi potrebbe aiutare?

DELETE UtentiPortale.*
FROM UtentiPortale RIGHT JOIN Vecchi_Accessi_Portale ON UtentiPortale.id_sis_user = Vecchi_Accessi_Portale.id_sis_user
Where UtentiPortale.id_sis_user = Vecchi_Accessi_Portale.id_sis_user

Grazie mille

15 Risposte

  • Re: Cancellazione record tramite query

    Vuoi eliminare da tabella utentiportale i record che hanno il campo id_sis_user prelevato dalla tabella vecchiaccessi?

    O vuoi toglierli da vecchiaccessi?

  • Re: Cancellazione record tramite query

    Voglio eliminare da tabella utentiportale i record che hanno il campo id_sis_user prelevato dalla tabella vecchiaccessi

  • Re: Cancellazione record tramite query

    Ok

    Utentiportale: tabA; vecchiaccessi: tabB;

    Delete tabA 

    From tabA

    Inner join tabB on tabA.campoA=tabB.campoB

    Where tabA.campoA=tabB.campoB

    Perché hai messo ,* tra delete e from?

    Perché hai usato right join?

  • Re: Cancellazione record tramite query

    Le due tabelle sono legate con una relazione right join, ma non ho nessun problema a togliere questo tipo di relazione.

    L'asterico era per indicare tutti i campi del record

  • Re: Cancellazione record tramite query

    Ho inserito il codice, ma esce il messaggio: specificare la tabella contenente i record da eliminare 

    DELETE UtentiPortale
    FROM UtentiPortale INNER JOIN Vecchi_Accessi_Portale ON UtentiPortale.id_sis_user = Vecchi_Accessi_Portale.id_sis_user
    WHERE (((UtentiPortale.id_sis_user)=[Vecchi_Accessi_Portale].[id_sis_user]));
    
  • Re: Cancellazione record tramite query

    Ho risolto scrivento questo codice:

    DELETE distinctrow Utentiportale.*
    from UtentiPortale INNER JOIN Vecchi_Accessi_Portale ON (UtentiPortale.[id_sis_user] = Vecchi_Accessi_Portale.[id_sis_user])
    WHERE (UtentiPortale.[id_sis_user]=Vecchi_Accessi_Portale.[id_sis_user])
  • Re: Cancellazione record tramite query

    L'asterico era per indicare tutti i campi del record

    Delete cancella il record formato da tutti i campi…

    https://www.mysqltutorial.org/mysql-delete-join/

  • Re: Cancellazione record tramite query

    23/06/2023 - Pmagno72 ha scritto:


    Ho risolto scrivento questo codice:

    DELETE distinctrow Utentiportale.*
    from UtentiPortale INNER JOIN Vecchi_Accessi_Portale ON (UtentiPortale.[id_sis_user] = Vecchi_Accessi_Portale.[id_sis_user])
    WHERE (UtentiPortale.[id_sis_user]=Vecchi_Accessi_Portale.[id_sis_user])

    Ok??

  • Re: Cancellazione record tramite query

    OK, grazie mille :-)

  • Re: Cancellazione record tramite query

    Ma una cosa semplice tipo

    DELETE FROM UtentiPortale UP
    WHERE UP.id_sis_user IN (SELECT VAP.id_sis_user FROM Vecchi_Accessi_Portale VAP)

    Specificare i nomi dei campi (anche con l'asterisco), benché sintatticamente ammesso, è semanticamente inutile/sbagliato. I records vengono cancellati per intero. A voler operare sui singoli campi serve l'UPDATE.

     La relazione serve per garantire l'integrità referenziale, la JOIN è di nuovo inutile in questo caso. Basta prendere tutti i valori da una tabella e dire di cancellare quelli dall'altra. Se ci sono li elimina. Se non ci sono non li considera.

  • Re: Cancellazione record tramite query

    Tutte le strade portano a roma… 

  • Re: Cancellazione record tramite query

    24/06/2023 - Sgrubak ha scritto:


    Ma una cosa semplice tipo

    DELETE FROM UtentiPortale UP
    WHERE UP.id_sis_user IN (SELECT VAP.id_sis_user FROM Vecchi_Accessi_Portale VAP)

    Specificare i nomi dei campi (anche con l'asterisco), benché sintatticamente ammesso, è semanticamente inutile/sbagliato. I records vengono cancellati per intero. A voler operare sui singoli campi serve l'UPDATE.

     La relazione serve per garantire l'integrità referenziale, la JOIN è di nuovo inutile in questo caso. Basta prendere tutti i valori da una tabella e dire di cancellare quelli dall'altra. Se ci sono li elimina. Se non ci sono non li considera.

    La soluzione in questione sicuramente è ottima, io la privilegerei di certo.

    Proverei tuttavia ad analizzare i piani di esecuzione della Query per valutarne l'efficienza nel caso le prestazioni potessero essere un fattore fondamentale.

    La Clausola IN è meno efficiente di un JOIN se poi sommiamo la SubSelect credo possa ulteriormente perdere di ottimizzazione.

    Lo strumento di JET che consente l'analisi dei piani di esecuzione non è proprio il massimo ma può essere utilizzato.

    Saluti

  • Re: Cancellazione record tramite query

    Vero… Ma per andare a Roma, se parto dal Brennero, che me ne faccio di passare da Bari?

    Anche perché la WHERE nella query “risolutiva” è inutile: a cosa serve selezionare solo i record in cui sono uguali i due campi id_sis_user, quando già l'INNER JOIN tira già fuori solo records che hanno quella caratteristica? Si può omettere e non costringere il motore a filtrare.

    24/06/2023 - @Alex ha scritto:


    La Clausola IN è meno efficiente di un JOIN se poi sommiamo la SubSelect credo possa ulteriormente perdere di ottimizzazione.

    Grazie della info. :) Farò qualche test.

  • Re: Cancellazione record tramite query

    24/06/2023 - @Alex ha scritto:


    24/06/2023 - Sgrubak ha scritto:


    Ma una cosa semplice tipo

    DELETE FROM UtentiPortale UP
    WHERE UP.id_sis_user IN (SELECT VAP.id_sis_user FROM Vecchi_Accessi_Portale VAP)

    Specificare i nomi dei campi (anche con l'asterisco), benché sintatticamente ammesso, è semanticamente inutile/sbagliato. I records vengono cancellati per intero. A voler operare sui singoli campi serve l'UPDATE.

     La relazione serve per garantire l'integrità referenziale, la JOIN è di nuovo inutile in questo caso. Basta prendere tutti i valori da una tabella e dire di cancellare quelli dall'altra. Se ci sono li elimina. Se non ci sono non li considera.

    La soluzione in questione sicuramente è ottima, io la privilegerei di certo.

    Proverei tuttavia ad analizzare i piani di esecuzione della Query per valutarne l'efficienza nel caso le prestazioni potessero essere un fattore fondamentale.

    La Clausola IN è meno efficiente di un JOIN se poi sommiamo la SubSelect credo possa ulteriormente perdere di ottimizzazione.

    Lo strumento di JET che consente l'analisi dei piani di esecuzione non è proprio il massimo ma può essere utilizzato.

    Saluti

    Delete up richiede che vi sia una integrità referenziale. 

    Usare la join in realtà ti va a creare un legame dove non hai previsto questa integrità… non ricordo access, ma alcuni db similari ad access per avere integrità referenziale i campi delle tabelle devono avere stesso nome stesso tipo di campo e stessa lunghezza. Con la join basta che siano delle stesse caratteristiche. In teoria, un cliente che sia anche fornitore puoi usare la join per eliminare in base al codice fiscale uguale sia in tab. Clienti che in tab. Fornitori. Magari perché la ditta non esiste più… ma tu non hai nessuna integrità referenziale (non avrebbe senso) tra clienti e fornitori.

    In questo caso sostituisci tab a e tab b con clienti e fornitori e i campi con cosicefiscale=codicefiscale…

    Io sono arrivato a roma in ogni caso. Quanto al giro, la velocità è solo nello scrivere la query (che scrivi solo una volta risparmiandoti le query parametriche). In esecuzione non fai in tempo a battere le ciglia…

Devi accedere o registrarti per scrivere nel forum
15 risposte