Sélectionnez des valeurs de colonne non concordantes à partir de deux tables

J'ai deux tables qui ont les mêmes noms de colonnes.

Par exemple:

Table de NEEDTOSYNCREQUESTS

Column Name Value ---------------------------- ID 1 LoadId L1 ShipmentId 123 OrderId NULL PackageId P456 CustomerOTP 99999 ClientOTP 88888 

LASTSYNCEDREQUEST table:

 Column Name Value ------------------------- ID 1 LoadId L1 ShipmentId NULL OrderId 1234567 PackageId P456 CustomerOTP 44444 ClientOTP 686868 

Si vous comparez la valeur de la colonne du tableau ci-dessus, vous pouvez voir ce qui suit:

  1. Les valeurs des colonnes CustomerOTP et ClientOTP ne sont pas identiques.
  2. La colonne ShipmentId dans NEEDTOSYNCREQUESTS a une valeur et la colonne ShipmentId dans la table LASTSYNCEDREQUEST est NULL.
  3. La colonne OrderId dans la table LASTSYNCEDREQUEST a la valeur et la colonne ShipmentId dans la table NEEDTOSYNCREQUESTS est NULL.

Donc, j'ai besoin de la sortie suivante. Comment y parvenir?

SORTIE

 Column Name Value --------------------------------- ID 1 LoadId NULL ShipmentId 123 OrderId NULL PackageId NULL CustomerOTP 99999 ClientOTP 88888 

La condition est, j'ai besoin de comparer les deux tables ci-dessus et nécessitait seulement la table NEEDTOSYNCREQUESTS de colonnes mise à jour par rapport à une autre table LASTSYNCEDREQUEST. Remarque: Les deux colonnes ont les mêmes valeurs ou NEEDTOSYNCREQUESTS. La colonne de table n'a pas de valeur alors ces colonnes doivent être nulles dans la sortie. PackageId dans la table est identique (identique). Donc, j'ai besoin que PackageId soit NULL dans la sortie.

Aidez-moi s'il vous plaît à réaliser ceci dans une requête SQL.

Merci d'avance!

Comme vous pouvez le voir, les mêmes règles implémentées dans 3 WHENs dans une instruction CASE pour tous les champs.

 SELECT A.ID, CASE WHEN A.LOADID = B.LOADID THEN NULL WHEN A.LOADID IS NULL THEN NULL WHEN (B.LOADID IS NULL AND A.LOADID IS NOT NULL) OR (A.LOADID IS NOT NULL AND B.LOADID IS NOT NULL) THEN A.LOADID END AS LOADID, CASE WHEN A.SHIPMENTID = B.SHIPMENTID THEN NULL WHEN A.SHIPMENTID IS NULL THEN NULL WHEN (B.SHIPMENTID IS NULL AND A.SHIPMENTID IS NOT NULL) OR (A.SHIPMENTID IS NOT NULL AND B.SHIPMENTID IS NOT NULL) THEN A.SHIPMENTID END AS SHIPMENTID, CASE WHEN A.ORDERID = B.ORDERID THEN NULL WHEN A.ORDERID IS NULL THEN NULL WHEN (B.ORDERID IS NULL AND A.ORDERID IS NOT NULL) OR (A.ORDERID IS NOT NULL AND B.ORDERID IS NOT NULL) THEN A.ORDERID END AS ORDERID, CASE WHEN A.PACKAGEID = B.PACKAGEID THEN NULL WHEN A.PACKAGEID IS NULL THEN NULL WHEN (B.PACKAGEID IS NULL AND A.PACKAGEID IS NOT NULL) OR (A.PACKAGEID IS NOT NULL AND B.PACKAGEID IS NOT NULL) THEN A.PACKAGEID END AS PACKAGEID, CASE WHEN A.CUSTOMEROTP = B.CUSTOMEROTP THEN NULL WHEN A.CUSTOMEROTP IS NULL THEN NULL WHEN (B.CUSTOMEROTP IS NULL AND A.CUSTOMEROTP IS NOT NULL) OR (A.CUSTOMEROTP IS NOT NULL AND B.CUSTOMEROTP IS NOT NULL) THEN A.CUSTOMEROTP END AS CUSTOMEROTP, CASE WHEN A.CLIENTOTP = B.CLIENTOTP THEN NULL WHEN A.CLIENTOTP IS NULL THEN NULL WHEN (B.CLIENTOTP IS NULL AND A.CLIENTOTP IS NOT NULL) OR (A.CLIENTOTP IS NOT NULL AND B.CLIENTOTP IS NOT NULL) THEN A.CLIENTOTP END AS CLIENTOTP FROM NEEDTOSYNCREQUESTS A INNER JOIN LASTSYNCEDREQUEST B ON A.ID = B.ID; 

vous pouvez essayer une requête basée sur un cas comme ci - dessous Voir la démo en direct

 select id = N.id, Loadid = case when ISNULL(N.Loadid,'')=ISNULL(L.Loadid,'') then NULL else N.LoadId end, Shipmentid=case when ISNULL(N.Shipmentid,'')=ISNULL(L.Shipmentid,'') then NULL else N.Shipmentid end, orderid=case when ISNULL(N.orderid,'')=ISNULL(L.orderid,'') then NULL else N.orderid end, packageid=case when ISNULL(N.packageid,'')=ISNULL(L.packageid,'') then NULL else N.packageid end, customerOTP=case when ISNULL(N.customerOTP,'')=ISNULL(L.customerOTP,'') then NULL else N.customerOTP end, clientOTP=case when ISNULL(N.clientOTP,'')=ISNULL(L.clientOTP,'') then NULL else N.clientOTP end from NEEDTOSYNCREQUESTS N LEFT JOIN LASTSYNCEDREQUEST L ON N.id=L.id 

Essaye ça:

 SELECT n.ID, n.LoadId, n.ShipmentId, n.OrderId, NULL PackageId, n.CustomerOTP, n.ClientOTP FROM NEEDTOSYNCREQUESTS AS n INNER JOIN LASTSYNCEDREQUEST AS l ON n.ID = l.ID AND n.LoadId = l.LoadId WHERE n.CustomerOTP <> l.CustomerOTP AND n.ClientOTP <> l.ClientOTP AND n.ShipmentId IS NOT NULL AND l.ShipmentId IS NULL AND l.OrderId IS NOT NULL AND l.ShipmentId IS NULL; 

Démo de Fiddle SQL

 | ID | LoadId | ShipmentId | OrderId | PackageId | CustomerOTP | ClientOTP | |----|--------|------------|---------|-----------|-------------|-----------| | 1 | L1 | 123 | (null) | (null) | 99999 | 88888 | 

Notez que, je ne comprends pas pourquoi le PackageId devrait être nul, parce que selon vos critères, il ne devrait pas. Quoi qu'il en soit, je le sélectionne comme une valeur NULL fixe, de sorte que vous obtiendrez toujours une valeur nulle quelle que soit la valeur réelle.

Je dois souvent résoudre un cas comme celui-ci lors de la création de l'extraction ou de l'intégration de données.

Donc la réponse pour moi sera proche de ceci:

vous pouvez utiliser la fonction MERGE et append un cas de commutation si vous souhaitez le personnaliser pour une colonne

 MERGE LASTSYNCEDREQUEST TGT USING ( SELECT ID, LoadId, ShipmentId, OrderId, PackageId, CustomerOTP, ClientOTP FROM NEEDTOSYNCREQUESTS ) AS SRC ON ( SRC.ID = TGT.ID) WHEN MATCHED THEN UPDATE SET TGT.ID = SRC.ID ,TGT.LoadID = NULL ,TGT.ShipmentID = SRC.ShipmentID ,TGT.OrderID = NULL ,TGT.PackageID = NULL ,TGT.CustomerOTP = SRC.CustomerOTP ,TGT.ClientOTP = SRC.ClientOTP WHEN NOT MATCHED THEN INSERT ( ID, LoadId, ShipmentId, OrderId, PackageId, CustomerOTP, ClientOTP ) VALUES ( SRC.ID, NULL, SRC.ShipmentId, NULL, NULL, SRC.CustomerOTP, SRC.ClientOTP ); SELECT * FROM LASTSYNCEDREQUEST 

vous pouvez essayer le code que j'écris ci-dessus.