UPDATE con più tabelle

di il
6 risposte

UPDATE con più tabelle

Partendo dal presupposto che io ho delle competenze molto basilari,
Sto cercando di aggiornare il campo Fatturazione.QTA con il valore presente in Clienti.QTAfinale:
il mio problema sorge nel collegamento delle due tabelle che non sono collegate tra loro direttamente bensì da una terza tabella (CSC) come riportato di seguito:

Clienti (ID_Cliente*,Codice,QTAfinale,...)
ClientiServiziCosti (ID_CSC*,ID_Cliente,ID_Servizio,...) --> abbreviata CSC
Fatturazione (ID_Fatturazione*,QTA,Numero,Data,ID_CSC)

chiavi primarie segnate con *, Foreign Key sottolineate

ho provato come segue:

UPDATE Fatturazione
INNER JOIN ClientiServiziCosti ON Fatturazione.ID_CSC = ClientiServiziCosti.ID_CSC
INNER JOIN Clienti ON ClientiServiziCosti.ID_Cliente = Clienti.ID_Cliente
SET Fatturazione.QTA=Clienti.QTAfinale;

ma non funziona, purtroppo non ne comprendo il motivo, dato anche che provando a fare un UPDATE con sole due tabelle coinvolte e tra loro collegate l'aggiornamento mi riesce usando la stessa sintassi ( UPDATE.... INNER JOIN... ON ...=... SET ....=....)
Mi sorge la domanda, è possibile eseguire un UPDATE facendo il collegamento tra 3 tabelle??

Il risultato finale che dovrei ottenere dalla query oltre ad avere il dato QTA nella tabella Fatturazione aggiornato è che segua queste condizioni:

Fatturazione.ID_Periodicita=18
AND ClientiServiziCosti.ID_Servizi=1


Vale a dire: aggiornare Fatturazione.QTA con il dato che si trova in Clienti.QTAfinale solo se Fatturazione.ID_Periodicita=18 AND ClientiServiziCosti.ID_Servizi=1
per tutti gli altri record che non soddisfano tali condizioni la qta rimane invariata.

Io ho una query che mi estrapola tutti i dati di cui necessito che seguano le due condizioni riportate sopra:

SELECT Clienti.CodiceDBS, Clienti.Denominazione, Fatturazione.QTA, Fatturazione.Prezzo, Fatturazione.ToT, ClientiServiziCosti.ID_Servizi
FROM (Fatturazione INNER JOIN ClientiServiziCosti ON Fatturazione.ID_CSC = ClientiServiziCosti.ID_CSC) INNER JOIN Clienti ON ClientiServiziCosti.ID_Cliente = Clienti.ID_Cliente
WHERE (((ClientiServiziCosti.ID_Servizi)=[Maschere]![consuntivo]![cboServizio]) AND ((Fatturazione.ID_Periodicita)=[Maschere]![consuntivo]![cboPeriodicita]));

Originariamente l'UPDATE doveva avvenire direttamente sul dato Fatturazione.QTA della query di selezione tramite un file .csv che conteneva appunto tale indicazione, tuttavia non riuscendo a fare questo aggiornamento da file esterno su una query ho dovuto trovare un'alternativa, quella di inserire il dato nella tabella Clienti (in quanto unica che mi permettesse il collegamento diretto tra il file e il db) e cercare di aggiornare la tabella Fatturazione usando un'altra tabella (problema posto all'inizio)

Premetto che non conosco il linguaggio VBA quindi se esiste una soluzione al problema che faccia uso di tale vi prego di segnalarmela o se sapete come aggiornare il dato nella query di selezione con file esterno ancora meglio.

Spero di essere stata quanto più chiara possibile, in caso contrario mi scuso e ringrazio in anticipo per l'aiuto.

6 Risposte

  • Re: UPDATE con più tabelle

    Salve a tutti,

    se ho ben capito, e quindi il codice
    
    SELECT *
    	FROM dbo.Cienti c
    		JOIN dbo.ClientiServiziCosti cc ON cc.ID_Cliente = c.ID_Cliente
    		JOIN dbo.Fatturazione f ON f.ID_CSC = cc.ID_CSC;
    
    soddisfa le esigenze, tecnicamente, senza utilizzare la sintassi MERGE, SQL Server accetta anche un'estensione non standard della sintassi di UPDATE come di seguito:
    
    UPDATE dbo.Fatturazione
    	SET QTA = c.QTAFinale
    	FROM dbo.Cienti c
    		JOIN dbo.ClientiServiziCosti cc ON cc.ID_Cliente = c.ID_Cliente
    		JOIN dbo.Fatturazione f ON f.ID_CSC = cc.ID_CSC;
    
    saluti omnia
    --
    Andrea
  • Re: UPDATE con più tabelle

    asql ha scritto:


    Salve a tutti,

    se ho ben capito, e quindi il codice
    
    SELECT *
    	FROM dbo.Cienti c
    		JOIN dbo.ClientiServiziCosti cc ON cc.ID_Cliente = c.ID_Cliente
    		JOIN dbo.Fatturazione f ON f.ID_CSC = cc.ID_CSC;
    
    soddisfa le esigenze, tecnicamente, senza utilizzare la sintassi MERGE, SQL Server accetta anche un'estensione non standard della sintassi di UPDATE come di seguito:
    
    UPDATE dbo.Fatturazione
    	SET QTA = c.QTAFinale
    	FROM dbo.Cienti c
    		JOIN dbo.ClientiServiziCosti cc ON cc.ID_Cliente = c.ID_Cliente
    		JOIN dbo.Fatturazione f ON f.ID_CSC = cc.ID_CSC;
    
    saluti omnia
    --
    Andrea
    Buongiorno,
    ho provato questa sintassi ma continua a darmi "Errore di sintassi (operatore mancante) nell'espressione della query...."
    Inoltre la condizione che mi rende necessario l'aggiornamento del dato QTA in Fatturazione non va inserita?

    Grazie!
  • Re: UPDATE con più tabelle

    E' possibile fare un UPDATE con INNER JOIN di 3 tabelle???
    O per qualche motivo l'UPDATE si fa con sole due 2 tabelle coinvolte??
  • Re: UPDATE con più tabelle

    Salve sdc98,
    il comando di update da me postato utilizza la sintassi NON standard supportata da SQL Server con join a 3 tabelle... come da BOL, l'update con n tabelle coinvolte e' possibile SE e SOLO SE l'aggiornamento riguarda 1 sola tabella, e nel caso sopra indicato, la condizione e' soddisfatta.
    ho provato questa sintassi ma continua a darmi "Errore di sintassi (operatore mancante) nell'espressione della query...."
    semprerebbe che il TUO comando sia in qualche modo sintatticamente NON valido... mancano "spazi" tra identificatori/operatori/istruzioni?
    sei poi sicuro che tu ti stia relazionando con SQL Server?
    Inoltre la condizione che mi rende necessario l'aggiornamento del dato QTA in Fatturazione non va inserita?
    non comprendo bene la richiesta... il tuo comando di aggiornamento iniziale riportava
    UPDATE Fatturazione
    INNER JOIN ClientiServiziCosti ON Fatturazione.ID_CSC = ClientiServiziCosti.ID_CSC
    INNER JOIN Clienti ON ClientiServiziCosti.ID_Cliente = Clienti.ID_Cliente
    SET Fatturazione.QTA=Clienti.QTAfinale;
    e qui NON vedo condizioni di filtro specifiche... tutta la tabella Fatturazione viene aggiornata nell'attributo [QTA] con il valore derivato dall'esplosione di JOIN effettuata...

    saluti omnia
    --
    Andrea
  • Re: UPDATE con più tabelle

    È possibile eseguire un UPDATE facendo il collegamento tra 3 tabelle??
    certo

    tu hai scritto:
    UPDATE Fatturazione
    INNER JOIN ClientiServiziCosti ON Fatturazione.ID_CSC = ClientiServiziCosti.ID_CSC
    INNER JOIN Clienti ON ClientiServiziCosti.ID_Cliente = Clienti.ID_Cliente
    SET Fatturazione.QTA=Clienti.QTAfinale;

    è sbagliato



    prova così:

    UPDATE Fatturtazione
    SET Fatturazione.QTA=Clienti.QTAfinale
    FROM Fatturazione
    INNER JOIN ClientiServiziCosti ON Fatturazione.ID_CSC = ClientiServiziCosti.ID_CSC
    INNER JOIN Clienti ON ClientiServiziCosti.ID_Cliente = Clienti.ID_Cliente
  • Re: UPDATE con più tabelle

    Grazie adm91,
    purtroppo le ho tentate tutte.

    sono sicura di relazionarmi con SQL Server

    non potendo più impiegarci altro tempo ho dovuto sviare il problema.
    ho creato una tabella contenente le qta che dovranno sostituire quelle già presenti e ho fatto il collegamento con la tabella clienti successivamente faccio la modifica manuale del dato...

    purtroppo questa è solo una soluzione temporanea in quanto avevo bisogno di aggiornare il dato urgentemente e questa era la soluzione che mi consentiva di ridurre al minimo il rischio di errore.

    questa soluzione è stata possibile solo perchè la quantità di dati da aggiornare era limitata tuttavia non sarà sempre cosi quindi devo assolutamente capire qual è l'errore di sintassi che non mi permette di utilizzare la query da te suggerita.

    ti ringrazio ancora per avermi dato riscontro.
Devi accedere o registrarti per scrivere nel forum
6 risposte