Utilizzo clausola WHEN NOT MATCHED BY SOURCE in MERGE

di il
1 risposte

Utilizzo clausola WHEN NOT MATCHED BY SOURCE in MERGE

Buonasera a tutti,
provo a chiedere lumi per questo problema che non riesco a risolvere.
NECESSITÁ: mi ritrovo a dover ricostruire un listino prezzi per ciascun cliente, partendo da un numero variabile di "micro listini". Non posso purtroppo creare un'associazione diretta 1-M tra clienti e listini.

TENTATIVO: Ho quindi optato per l'utilizzo di una istruzione MERGE, generando i dati di partenza con una CTE. Di seguito lo script: [CODE]DECLARE @Id_RevPartenza as int, @Promo as int, @DataValidita as datetime SET @Id_RevPartenza = 2796 -- 2597 = Promo Tubo 0 | 2720 = Promo 2 -- 2790 = Promo FGS | 2796 = Promo nipli SET @Promo = 23 -- 24 = Promo 0 tubo | 26 = Promo 2 tubo -- 22 = Promo FGS | 23 = Promo Nipli SET @DataValidita = '20220502' --Creo la cte con i prezzi di partenza ;WITH PrezziPromo AS( SELECT Cd_AR, Prezzo, Sconto FROM LSArticolo WHERE Id_LSRevisione = @Id_RevPartenza) --Creo i dati che da aggiornare/inserire , src as ( Select L.Id_LSRevisione, PP.Cd_AR, PP.Prezzo, PP.Sconto From CFCliCFCliAttributo A Inner Join CF on CF.Cd_CF = A.Cd_CF Inner Join LSEx(@DataValidita) L On L.Cd_LS = CF.Cd_LS_1 Cross join PrezziPromo PP Where Id_Attributo = @Promo And L.Avanzato = 1) -- Test intermedio per verifica dei dati che verranno immessi -- SELECT * FROM src MERGE LSArticolo AS tgt USING src ON (tgt.Id_LSRevisione = src.Id_LSRevisione AND tgt.Cd_AR = src.Cd_AR) WHEN MATCHED THEN UPDATE SET tgt.Prezzo = src.Prezzo, tgt.Sconto = src.Sconto WHEN NOT MATCHED BY TARGET THEN INSERT (Id_LSRevisione, Cd_AR, Prezzo, Sconto) VALUES (src.Id_LSRevisione, src.Cd_AR, src.Prezzo, src.Sconto); Quasi tutto funzionante. L'inserimento e l'aggiornamento dei dati procede regolarmente. Ma per gestire il caso in cui un prezzo venga cancellato dal micro listino, ho tentato di aggiungere la clausola
WHEN NOT MATCHED BY SOURCE THEN
	DELETE;
sperando di eliminare dalla tabella target un dato che in tabella source non c'è più. Purtroppo l'elaborazione diventa interminabile (a 30 secondi di esecuzione ho interrotto... Senza l'ultima clausola, lo script impiega mezzo secondo abbondante ad allineare le tabelle).
Ho impostato male lo script e non me ne accorgo, o devo per forza migrare sulle istruzioni esplicite come nell'

1 Risposte

  • Re: Utilizzo clausola WHEN NOT MATCHED BY SOURCE in MERGE

    AGGIORNAMENTO:
    Ho tentato la sorte... Ho lasciato completare l'esecuzione dello script e non è stata una buona idea.
    Mi sono ritrovato con la tabella di partenza [LSArticolo] svuotata di TUTTI i record ad eccezione di quelli che volevo inserire...
    A rileggere la guida, dice espressamente che la clausola WHEN NOT MATCHED BY SOURCE
    Specifica che tutte le righe di *target_table che non corrispondono alle righe restituite da <table_source> ON <merge_search_condition> e che soddisfano eventuali condizioni di ricerca aggiuntive vengono aggiornate oppure eliminate in base alla clausola <merge_matched>.
    L'eliminazione quindi viene però apparentemente effettuata sulla sorgente e non sul target. Il perché mi resta un mistero... Proverò a specificare anche la clausola <merge_matched> e vedo se si comporta come mi aspetto.
Devi accedere o registrarti per scrivere nel forum
1 risposte