Générer un rapport qui montre quels identifiants correspondent entre deux tables SQL

J'ai une requête SQL que j'exécute pour insert des valeurs de table1 à table2 uniquement lorsque les ID de la ligne de table correspondent:

UPDATE PT SET CreditInvoiceAmount = CSV.CreditInvoiceAmount ,CreditInvoiceDate = CSV.CreditInvoiceDate ,CreditInvoiceNumber = CSV.CreditInvoiceNumber ,CreditDeniedDate = CSV.CreditDeniedDate ,CreditDeniedReasonId = CSV.CreditDeniedReasonId ,CreditDeniedNotes = CSV.CreditDeniedNotes ,StatusId = CASE WHEN CSV.CreditInvoiceDate IS NULL AND CSV.CreditDeniedDate IS NOT NULL THEN 7 ELSE 8 END FROM PermanentTable PT INNER JOIN TemporaryCsvUpload CSV ON PT.Id = CSV.Id 

Je dirais qu'environ 60% des ID de la table temporaire correspondent aux ID de la table permanente. Je voudrais générer un type de rapport pour afficher les ID correspondants et ceux qui ne correspondent pas. Le format dans lequel j'affiche cette information n'a pas vraiment d'importance (tableau HTML, feuille Excel, peu importe). Je ne sais pas comment j'utiliserais une requête pour get cette information afin de pouvoir l'afficher. Merci de votre aide!

Pour afficher tous les ID et s'ils se trouvaient dans l'une ou les deux tables, essayez ceci; il returnnera une list d'identifiants qui se trouvent dans au less une table, avec un drapeau indiquant la ou les tables dans lesquelles ils apparaissent:

 Select ISNULL(p.ID, t.ID) as ID , case when p.ID is not null then 'Y' else 'N' end as InPermanentTable , case when t.ID is not null then 'Y' else 'N' end as InTemporaryTable from PermanentTable p full outer join TemporaryCsvUpload t on p.ID = t.ID 

Pour renvoyer uniquement les ID de la table temporaire, avec un indicateur indiquant s'ils se trouvaient dans la table permanente ou non, utilisez ceci:

 Select t.ID , case when p.ID is not null then 'Y' else 'N' end as InPermanentTable from TemporaryCsvUpload t left join PermanentTable p on p.ID = t.ID 

La déclaration MERGE correspondra à ce que vous cherchez. Il est capable de mettre à jour ceux qui correspondent, d'insert ceux qui ne correspondent pas, et de vous rapporter ce qui correspond et ce qui n'a pas été fait. Il est préférable de consigner la sortie dans une autre table.

 MERGE PermanentTable P --target USING TemporaryCsvUpload T --source ON P.Id = T.Id WHEN MATCHED THEN UPDATE P SET CreditInvoiceAmount = T.CreditInvoiceAmount ,CreditInvoiceDate = T.CreditInvoiceDate ,CreditInvoiceNumber = T.CreditInvoiceNumber ,CreditDeniedDate = T.CreditDeniedDate ,CreditDeniedReasonId = T.CreditDeniedReasonId ,CreditDeniedNotes = T.CreditDeniedNotes ,StatusId = CASE WHEN T.CreditInvoiceDate IS NULL AND T.CreditDeniedDate IS NOT NULL THEN 7 ELSE 8 END WHEN NOT MATCHED THEN INSERT (P columns go here) VALUES (T columns go here) OUTPUT $action, Inserted.Id --Inserted will show both inserted and updated to IDs , Deleted.Id --Deleted will show IDs that were changed in the UPDATE 

Puisque vous mettez à jour / insérez seulement, quand l'action est UPDATE, l'identification insérée et supprimée sera la même chose.

Vous pouvez également modifier le WHEN NOT MATCHED pour vous connecter à un tableau séparé, plutôt qu'à PermanentTable.