Query update progressivo campo in comune tra 2 tabelle

di il
14 risposte

Query update progressivo campo in comune tra 2 tabelle

Buongiorno a tutti

sono Diego e sono nuovo di questo forum ed è un piacere entrare a far parte di una community di cervelloni
Lavoro con un gestionale basato su DB Microsoft Sql, utilizzando SSMS 2017 ma sto avendo un problema con una query di update per l'aggiornamento di un campo in progressivo in comune tra 2 tabelle.
Entro nel concreto: Tabella 2 (quella da popolare) ha in comune il campo ID con la Tabella1 che ad ogni registrazione di un operazione assegna un numero progressivo.
Per non incappare in doppioni ed evitare crash del mio gestionale, dovrei popolare lo stesso campo ID della Tabella 2 con il numero progressivo ID della Tabella1, quindi con il count dall'ultimo in avanti insomma avete un qualche buon suggerimento?

Grazie mille a tutti i colleghi in anticipo che risponderanno e parteciperanno alla discussione.

Saluti e buon lavoro

14 Risposte

  • Re: Query update progressivo campo in comune tra 2 tabelle

    Salve Diego,
    "campo in comune" e' da intendersi immagino come una foreign key, vero?
    da come ti sei espresso non ho compreso se si tratta di una situazione di master/detail o cosa...
    in questo scenario, ovviamente Tabella2 (che sarebbe il "Dettaglio") e' "vincolata" (appunto con un vincolo di integrita' referenziale) con Tabella1 (che sarebbe la "Testata")

    in questo senso, ovviamente prima inserisci la testata e utilizzi la valorizzazione della chiave primaria per poi inserire le righe di dettaglio che referenzino quella riga di testata. Questa valorizzazione puo' essere automatica (ad esempio impostando la proprieta' IDENTITY della colonna Id di Tabella1, oppure puo' anche essere generata manualmente con un COUNT(*) +1, operazione comunque "costosa" in termini prestazionali in ambiente concorrente e con tabella altamente popolata, ma questo e' un altro discorso)..
    ad ogni modo, normalmente si utilizza un "parametro" da restituire al chiamante all'uscita del comando di INSERT, parametro che andrai a leggere ed utilizzare per popolare la colonna di Tabella2 prima di procedere all'INSERT dei dettagli...

    e' questo cio' che intendi? pernche' per come ti sei espresso fatico a comprendere il tuo scenario

    salutoni romagnoli
    --
    Andrea
  • Re: Query update progressivo campo in comune tra 2 tabelle

    Ciao

    In realtà non è chiara nemmeno a me la richiesta, però l'ho intuita in modo leggermente diverso, ovvero che le due tabelle devono in qualche modo condividere lo stesso numeratore usato per il campo ID.

    Se così fosse, non mi è chiaro il senso del campo ID:
    • Tabella 1 e Tabella 2 riguardano la stessa entità ma contengono dati diversi. Il medesimo valore nel campo ID indica che si tratta dello stesso elemento. Per fare un esempio: entrambe le tabelle sono dati del cliente, solo che Tabella 1 contiene i dati anagrafici, mentre Tabella 2 contiene i dati economici. A parità di ID i dati si intendono relativi allo stesso cliente. In questo modo se un ordine referenzia il cliente con ID 1, la procedura può andare direttamente nella Tabella 1 o Tabella 2 per avere i dati che servono
    • Tabella 1 e Tabella 2 riguardano entità diverse fra loro ma per questioni di procedura devono avere degli identificativi che non si intersecano. Non riesco a figurarmi un caso, però tutto può succedere

    In entrambi i casi abbiamo bisogno di avere un numeratore univoco quando inseriamo un nuovo elemento.
    Per farlo è sufficiente procedere in questo modo (poi le query SQL le puoi cercare in internet se non le conosci):
    • Crei una sequenza e gli dai un nome specifico (su SQL è il comando "create sequence")
    • Tabella 1 e Tabella 2 hanno un campo ID
    • Tabella 1 e Tabella 2 hanno un trigger in inserimento che popola il campo ID prendendo il valore successivo della sequenza specifica (stessa sequence per entrambe le tabelle). Nel caso di dati splittati su più tabelle (mio esempio dei clienti) puoi fare in modo che il trigger si attivi solo se il campo ID è null (o zero). In questo modo se stai creando un record nuovo in Tabella 2 che esiste già in Tabella 1, nella insert puoi passargli il valore dell'ID e il trigger userà quello senza andare nella sequenza. Ovviamente è compito della tua procedura/query quello di passare l'ID corretto

    Non so se questo sia quanto ti serva
  • Re: Query update progressivo campo in comune tra 2 tabelle

    Buongiorno,
    innanzitutto grazie per le risposte cerco di spiegarmi meglio: la tabella 1 (la principale) ad ogni operazioni fatta in magazzino registra un record identificato con la colonna ID; io devo importare dentro al mio gestionale la tabella 2 (che ho già creato sul mio DB) e mi manca da popolare il campo ID di questa tabella 2 che deve essere consecutivo all'ultimo valore del campo ID della tabella 1.
    Il campo ID è il medesimo, io devo popolare il campo ID della tabella 2 senza doppioni, quindi devo assegnare un valore per ogni riga...
  • Re: Query update progressivo campo in comune tra 2 tabelle

    Salve Diego,
    Spiacente, ma io ancora non ho capito....

    "... io devo importare dentro al mio gestionale la tabella 2..."

    Cos'è Tabella2???
    È come ho scritto io, come ha scritto @pigi78?
    O altro ancora?
    Non riesco a comprendere lo scenario...

    A parte che il COUNT(*) +1 non lo userei mai per una chiave primaria... Al limite un MAX +1... ma proprio al limite

    salutoni romagnoli
    --
    Andrea
  • Re: Query update progressivo campo in comune tra 2 tabelle

    Provo ad essere più sintetico: la mia tabella principale si chiama MG7G_PROGQTAVARIREF e assegna un numero progressivo per ogni operazione mediante la colonna MG7G_ID_MG7I; quindi la colonna MG7G_ID_MG7I avrà un numero progressivo 1,2,3,4,5,6 ecc...
    Ho una seconda tabella, nome Tbl_rettlotti_08_09 con alcuni campi compilati ma il campo MG7G_ID_MG7I NULL.
    Devo popolare il campo MG7G_ID_MG7I della tabella Tbl_rettlotti_08_09 con lo stesso numeratore del campo MG7G_ID_MG7I della tabella
    MG7G_PROGQTAVARIREF...ho provato con update e MAX+1 ma non ci arrivo in quel modo...
  • Re: Query update progressivo campo in comune tra 2 tabelle

    Salve Diego....
    A prescindere dal contesto...

    Tu esegui il comando di
    INSERT MG7G_PROGQTAVARIREF
    VALUES (....)

    e generi a tuo piacimento il valore di MG7G_ID_MG7I...
    Questo valore lo ritornerai al chiamante come parametro in output....

    Lato client, dopo l'esecuzione dell'insert di MG7G_PROGQTAVARIREF, leggi il valore di MG7G_ID_MG7I caricato nel parametro e prepari il comando di INSERT Tbl_rettlotti_08_09...

    Non quadra?
    Salutoni romagnoli
    --
    Andrea
  • Re: Query update progressivo campo in comune tra 2 tabelle

    Salve Andrea,
    per me possiamo darci del tu senza problemi come preferisce; quindi lei dice di popolare la tabella principale e poi richiamare i valori sulla Tbl_rettlotti_08_09? Non so se funziona perchè il valore nella tabella MG7G_PROGQTAVARIREF secondo me viene scritto quando con un import che faccio sul mio gestionale, importo la tabella Tbl_rettlotti_08_09 che mi genera un documento di rettifica per alcune giacenze di magazzino; secondo me io dovrei solo partire dall'ultimo valore e compilare la Tbl_rettlotti_08_09...
  • Re: Query update progressivo campo in comune tra 2 tabelle

    Salve Diego,
    Il contesto quindi è un bulk insert da caricamento massivo?
    Come avviene tutto ciò?

    Secondo me ci stiamo perdendo in un bicchiere di acqua...

    Salutoni romagnoli
    --
    Andrea
  • Re: Query update progressivo campo in comune tra 2 tabelle

    Non proprio, cioè non direttamente: in pratica io popolo la tabella Tbl_rettlotti_08_09 ma poi quest'ultima viene importata sul gestionale mediante un tracciato, dall'importazione quindi la tabella Tbl_rettlotti_08_09 genera un documento di rettifica di cui alcuni di questi campi andranno a popolare la MG7G_PROGQTAVARIREF tra cui c'è il campo MG7G_ID_MG7I...
  • Re: Query update progressivo campo in comune tra 2 tabelle

    Salve Diego....
    Vediamo se ho capito....
    Tu popoli manualmente Tbl_rettlotti_08_09... E Non puoi ovviamente valorizzare l'attributo MG7G_ID_MG7I, che sarà null..

    Periodicamente viene eseguito un processo carica tutte le righe di Tbl_rettlotti_08_09 where MG7G_ID_MG7I is null nella tabella MG7G_PROGQTAVARIREF....
    In questo momento, tu hai bisogno di valorizzare la riga corrispondente in Tbl_rettlotti_08_09 con il corretto valore di MG7G_ID_MG7I....

    Se questo è vero, la cosa si può fare anche con un trigger, sempre che MG7G_PROGQTAVARIREF contenga un riferimento univoco alla riga Tbl_rettlotti_08_09 di origine.... Spesso si usano colonne tipo "CodiceEsterno" per fare questi "accrocchi" dove viene salvata la chiave primaria della tabella esterna

    Salutoni romagnoli
    --
    Andrea
  • Re: Query update progressivo campo in comune tra 2 tabelle

    Esatto, popolo Tbl_rettlotti_08_09 con un import Excel in sostanza e lascio vuota la colonna MG7G_ID_MG7I, che risulta NULL...il problema sta che in pratica tutti i campi della Tbl_rettlotti_08_09 sono contenuti nella MG7G_PROGQTAVARIREF...perchè deve fare una somma e/o una sottrazione in base ai valori che ho nella Tbl_rettlotti_08_09...
  • Re: Query update progressivo campo in comune tra 2 tabelle

    Diego,
    ho difficolta' a comprendere la cosa, cosi' "a spizzichi e bocconi"... ma sicuramente e' un problema mio...

    al di la' di cio', e comunque considerando che un'operazione ETL (extract + transform + load) difficilmente si traduce in una pura operazione bulk insert, vorrei pensare che la mia precedente risposta, brutale e interamente basata su un processo SQL, possa essere affinata passando da un ambito procedurale e di struttura ad un ambito piu' architetturale...

    voglio pensare che ci sia un'applicazione, un servizio, che periodicamente faccia l'operazione di lettura da Tbl_rettlotti_08_09 per fare il necessario clean up e preparazione all'insert in MG7G_PROGQTAVARIREF ...
    questo modulo si puo' quindi occupare di SELECT da Tbl_rettlotti_08_09 ... caricare MG7G_PROGQTAVARIREF, ottenere in output il valore di MG7G_ID_MG7I, ed aggiornare con tale valore Tbl_rettlotti_08_09 ...
    questo dovrebbe essere "il modus" da perseguire...
    una modalita' piu' architetturale basata su business logic...

    SE invece fai effettivamente come prima ho "in semplicita'" indicato,
    INSERT INTO MG7G_PROGQTAVARIREF
    SELECT x, y, z, CASE WHEN k > 1 THEN m * k ELSE m + k END, altra "logica", "altre colonne"
    FROM Tbl_rettlotti_08_09
    WHERE MG7G_ID_MG7I IS NULL;

    allora effettivamente dovrai occuparti di un trigger che riesca a referenziare le righe di Tbl_rettlotti_08_09 con la relativa primary key o anche una alternative candidate key naturale (visto che in MG7G_PROGQTAVARIREF dici che hai tutti gli attributi di Tbl_rettlotti_08_09) ... e' un giochino un po' sporco... ma si fa anche questo...

    mi e' tutto ancora un po' confuso... ma sicuramente e' un mio limite...

    comunque, salutoni romagnoli
    --
    Andrea
  • Re: Query update progressivo campo in comune tra 2 tabelle

    Confermo quanto affermato da @asql:

    tutto troppo confuso

    Non si capisce quante tabelle vengono aggiornate: 1 o 2?

    Possiamo vedere l'elenco dei campi di queste tabelle e relativi attributi?
  • Re: Query update progressivo campo in comune tra 2 tabelle

    Buonasera a tutti,

    scusate ma sono rimasto fuori per qualche giorno per problemi personali...alla fine ho risolto con uno script che dal gestionale mi popolasse direttamente il campo quando veniva generato il documento...quindi ho importato direttamente la tabella rettifica lotti senza il campo MG7G_ID_MG7I e quest'ultimo si è generato per ogni riga del documento creato dalla tabella sql...
Devi accedere o registrarti per scrivere nel forum
14 risposte