Mostra paginaRevisioni precedentiPuntano quiTorna su Questa pagina è in sola lettura. Puoi visualizzare il sorgente, ma non puoi modificarlo. Contatta l'amministratore se pensi che ci sia un errore. {{:wiki:icons:t-sql.png?nolink&90 |}} <fs xx-large>Auto self-join per raggruppare in base ad un criterio</fs> [[hobby:development:sql|{{ :wiki:icons:left_arrow.png?48|Vai alla mappa}}]]\\ //<fc #5F5F5F><fs large>(Come eseguire un self join per filtrare il raggruppamento ottenuto)</fs></fc>// \\ \\ Il problema in analisi è quello che si presenta ogni volta che si vuole ottenere l'ultima versione del dato di una determinata anagrafica.\\ Un esempio molto semplice potrà far capire meglio di tante spiegazioni Serviamoci della seguente tabella di esempio: <sxh sql> USE DbTemp IF OBJECT_ID(N'dbo.tblHistory', 'U') IS NOT NULL DROP TABLE dbo.tblHistory -- Create table [dbo].[tblHistory] PRINT (N'Create table [dbo].[tblHistory]') CREATE TABLE dbo.tblHistory ( IdHistory INT NULL DEFAULT (0) ,IdData int NULL DEFAULT (0) ,Description varchar(50) NULL DEFAULT ('') ) ON [PRIMARY] </sxh> che andremo a popolare con pochi dati ma sufficienti per capire <sxh sql> INSERT INTO dbo.tblHistory (IdHistory, IdData, Description) VALUES (1, 1, 'Descrizione primo record') ,(2, 1, 'Descrizione primo record prima modifica') ,(3, 1, 'Descrizione primo record ultima modifica') ,(4, 2, 'Descrizione secondo record') ,(5, 2, 'Descrizione secondo record prima modifica') ,(6, 2, 'Descrizione secondo record ultima modifica') ,(7, 3, 'Descrizione terzo record') ,(8, 3, 'Descrizione terzo record ultima modifica') ,(9, 4, 'Descrizione quarto record') ,(10, 4, 'Descrizione quarto record ultima modifica') </sxh> quindi con una semplice select otterremo: <sxh sql> SELECT * FROM dbo.tblHistory; </sxh> ^IdHistory^IdData^Description^ |1|1|Descrizione primo record| |2|1|Descrizione primo record prima modifica| |3|1|Descrizione primo record ultima modifica| |4|2|Descrizione secondo record| |5|2|Descrizione secondo record prima modifica| |6|2|Descrizione secondo record ultima modifica| |7|3|Descrizione terzo record| |8|3|Descrizione terzo record ultima modifica| |9|4|Descrizione quarto record| |10|4|Descrizione quarto record ultima modifica| Tramite la colonna **IdData** possiamo identificare tutte le revisioni di un anagrafica, ma l'obbiettivo è quello di estrarre solo le anagrafiche nell'ultima versione, cioè quelle che a pari valore di //IdData// hanno **IdHistory** maggiore. La soluzione è relativamente semplice e consiste nel ricorrere ad un self-join come quello che segue: <sxh sql> SELECT tblA.* FROM tblHistory tblA LEFT JOIN tblHistory tblB ON tblA.IdData = tblB.IdData AND tblA.IdHistory < tblB.IdHistory WHERE tblB.IdHistory IS NULL </sxh> ^IdHistory^IdData^Description^ |3|1|Descrizione primo record ultima modifica| |6|2|Descrizione secondo record ultima modifica| |8|3|Descrizione terzo record ultima modifica| |10|4|Descrizione quarto record ultima modifica| hobby/development/sql/select/query_0001.txt Ultima modifica: 2021/01/04 12:35da mauro.cortese