Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    86

    [MYSQL] comando 'IN' e operatore #[1]

    Salve a tutti ragazzi ! Dovrei effettuare questa query :
    1) Impostare a valore nullo il campo Codice_editore nella tabella Libri per tutte le tuple relative all’editore di nome 'Addison Wesley

    e per farla ho fatto cosi :
    codice:
    UPDATE Libri SET Codice_editore = null WHERE Codice_editore IN ( SELECT Codice_editore FROM Editori WHERE Nome_editore = 'Addison Wesley' );
    mentre un mio amico che ha svolto gia' questo esercizio ha utilizzato questa :
    codice:
    UPDATE Libri SET Codice_editore = null WHERE Codice_editore = ( #[1]SELECT Codice_editore FROM Editori WHERE Nome_editore = 'Addison Wesley' );
    
    [1]si usa l'operatore = in quanto stiamo implicitamente assumendo
       che non possano esistere due editori aventi lo stesso nome e 
       quindi che la select selezioni un solo codice, altrimenti avremmo usato IN */
    il problema è che la mia query non ha nessun effetto mentre se utilizzo la seconda query mysql mi da errore ! Qualcuno mi sa spiegare dove sbaglio e la differenza tra le due notazioni ?

  2. #2
    provo a risponderti ma non so se saro' preciso:

    la seconda query da errore perche quelle annotazioni (nel where) si riferiscono alla nota in calce e non e' parte della query.


    Poi, la "vera" differenza tra IN() ed = seguite da subquery e' che IN() presume di ricevere una lista mentre con = si presume di riceverne un solo dato.

    IN e' in pratica un sinonimo di "= ANY" ma non pero' se ricevi una lista.

    Invece della subquery potresti anche provare l'update multitabella (che poi e' la stessa cosa).

    es.:

    codice:
    UPDATE Libri, editori 
    SET Libri.Codice_editore = null 
    WHERE Libri.Codice_editore = editori.Codice_editore
    AND  editori.Nome_editore = 'Addison Wesley';
    Se ragioni su questa query puoi capire bene la differenza tra le tue due. Anzi direi che l'update multitabella integra entrambe le tue due proposte, cioe' va bene sia per una lista che per un singolo dato trovato (col where). Personalmente la preferisco perche' la trovo piu' chiara come esposizione.

    in pratica la differenza sarebbe poi la seguente:

    la prima: where campo IN (codice editore di 'Addison Wesley')
    la seconda: where campo = (codice editore di 'Addison Wesley')

    Perche' la tua prima query non funzioni questo e' piu' difficile da presumere. IN() distingue il tipo di valore immesso tra numerico e stringa e si comporta essenzialmente come una OR se presente una lista. Ma potrebbe anche essere altra la causa del mancato aggiornamento.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.