我有两个具有相同列名的表。
例如:
NEEDTOSYNCREQUESTS 表
Column Name Value
----------------------------
ID 1
LoadId L1
ShipmentId 123
OrderId NULL
PackageId P456
CustomerOTP 99999
ClientOTP 88888
LASTSYNCEDREQUEST表:
Column Name Value
-------------------------
ID 1
LoadId L1
ShipmentId NULL
OrderId 1234567
PackageId P456
CustomerOTP 44444
ClientOTP 686868
如果您比较上表的列值,您可以看到以下内容:
- CustomerOTP 和 ClientOTP 列值不相同。
- NEEDTOSYNCREQUESTS 中的 ShipmentId 列具有值,而 LASTSYNCEDREQUEST 表中的 ShipmentId 列为 NULL。
- LASTSYNCEDREQUEST 表中的 OrderId 列有值,而 NEEDTOSYNCREQUESTS 表中的 ShipmentId 列为 NULL。
所以,我需要得到以下输出。如何实现这一目标?
输出
Column Name Value
---------------------------------
ID 1
LoadId NULL
ShipmentId 123
OrderId NULL
PackageId NULL
CustomerOTP 99999
ClientOTP 88888
条件是,我需要比较上述两个表,并且与另一个 LASTSYNCEDREQUEST 表进行比较时,只需要更新 NEEDTOSYNCREQUESTS 表的列值。注意:两列具有相同的值,或者 NEEDTOSYNCREQUESTS 表列没有值,那么这些列在输出中应为空。两个表中的PackageId 是相同的(相同)。因此,我需要输出中的 PackageId 为 NULL。
请帮助我在 SQL 查询中实现此目的。
提前致谢!
最佳答案
正如您所看到的,在 CASE 语句中的 3 个 WHEN 中为所有字段实现了相同的规则。
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;
关于sql - 从两个表中选择不匹配的列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48019285/