Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    cancellare dalla stessa tabella con valore min(campo)

    Salve,
    ho fatto una select per ottenere un determinato risultato:
    codice:
    SELECT * FROM nome_tabella AS a
    WHERE
    a.nome_mese = 'gennaio' AND a.data_inserimento < (SELECT min(b.data_inserimento) FROM nome_tabella AS b WHERE b.nome_mese <> 'gennaio' AND b.id_utente = a.id_utente)
    Funziona!

    A questo punto però, ho la necessità di cancellare le stesse righe ottenute dalla select, quindi ho pensato di fare così:
    codice:
    DELETE a.* FROM nome_tabella AS a WHERE a.nome_mese = 'gennaio' AND a.data_inserimento < (SELECT MIN(b.data_inserimento) FROM nome_tabella AS b WHERE b.nome_mese <> 'gennaio' AND b.id_utente = a.id_utente)
    La cancellazione non funziona e genera questo errore:
    codice:
    1093 - Table 'a' is specified twice, both as a target for 'DELETE' and as a separate source for data
    Googlando sembra che si possa ovviare al problema usando il JOIN ... ma non riesco a venirne a capo.
    Qualcuno mi può dare dei suggerimenti?
    grazie.

  2. #2
    Utente di HTML.it L'avatar di vnt54
    Registrato dal
    Mar 2009
    Messaggi
    498
    Quote Originariamente inviata da DUMAX Visualizza il messaggio
    Salve,
    ho fatto una select per ottenere un determinato risultato:
    codice:
    SELECT * FROM nome_tabella AS a
    WHERE
    a.nome_mese = 'gennaio' AND a.data_inserimento < (SELECT min(b.data_inserimento) FROM nome_tabella AS b WHERE b.nome_mese <> 'gennaio' AND b.id_utente = a.id_utente)
    Funziona!

    A questo punto però, ho la necessità di cancellare le stesse righe ottenute dalla select, quindi ho pensato di fare così:
    codice:
    DELETE a.* FROM nome_tabella AS a WHERE a.nome_mese = 'gennaio' AND a.data_inserimento < (SELECT MIN(b.data_inserimento) FROM nome_tabella AS b WHERE b.nome_mese <> 'gennaio' AND b.id_utente = a.id_utente)
    La cancellazione non funziona e genera questo errore:
    codice:
    1093 - Table 'a' is specified twice, both as a target for 'DELETE' and as a separate source for data
    Googlando sembra che si possa ovviare al problema usando il JOIN ... ma non riesco a venirne a capo.
    Qualcuno mi può dare dei suggerimenti?
    grazie.
    Invece di fare la select(che il messaggio è abbastanza chiaro)fai l'istruzione delete direttamente.
    Sono stato nella terra della paura e dei vampiri...in transilvania?NO!..in Banca!

  3. #3
    ciao,
    non penso di aver capito quello che vuoi dire ... la select mi serviva solo per identificare le righe che, una volta verificate, avrei cancellato.
    Ma la select non mi sarebbe servita più. Avrei fatto solo la DELETE che però non funziona.
    Quindi alla fine ho optato per la SELECT dell'id della riga e successivamente ho fatto la DELETE con IN nella WHERE.

    Per capirci:
    codice:
    SELECT a.id FROM nome_tabella AS a
    WHERE
    a.nome_mese ='gennaio' AND a.data_inserimento <(SELECT min(b.data_inserimento) FROM nome_tabella AS b WHERE b.nome_mese 
    e successivamente ho usato gli id per la cancellazione:
    codice:
    DELETE FROM nome_tabella WHERE id IN (1, 2, 3, 4, 5)
    Ultima modifica di DUMAX; 01-12-2022 a 08:58

  4. #4
    in un botto solo

    codice:
    DELETE FROM nome_tabella WHERE id IN (SELECT a.id FROM nome_tabella AS aWHERE
    a.nome_mese ='gennaio' AND a.data_inserimento <(SELECT min(b.data_inserimento) FROM nome_tabella AS b WHERE b.nome_mese)

  5. #5
    scusa, non penso che funzionerebbe ... manca "AND b.id_utente = a.id_utente" nella subquery, altrimenti succede il casino [vedi la query di SELECT nel post di apertura].

    Grazie del suggerimento.

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    L'errore iniziale era aver specificato a.* dopo DELETE.
    DELETE non vuole (per ovvie ragioni) una lista di campi, visto che cancella l'intero record.

    codice:
    DELETE
    FROM Tabella
    WHERE condizioni
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Ciao,

    inizialmente non c'era a.* ... è stata una delle mie tante prove ... il problema è la subquery con la stessa tabella ... sembra che così non si possa fare.
    codice:
    1093-Table'a'is specified twice, both as a target for'DELETE'andas a separate source for data
    Comunque sia ho risolto facendo due query distinte.

    Grazie.

  8. #8
    Ciao,

    inizialmente non c'era a.* ... è stata una delle mie tante prove ... il problema è la subquery con la stessa tabella ... sembra che così non si possa fare.
    codice:
    1093-Table'a'is specified twice, both as a target for 'DELETE' and as a separate source for data
    Comunque sia ho risolto facendo due query distinte.

    Grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.