sql - 从两个表中选择不匹配的列值

标签 sql sql-server sql-server-2012

我有两个具有相同列名的表。

例如:

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

如果您比较上表的列值,您可以看到以下内容:

  1. CustomerOTP 和 ClientOTP 列值不相同。
  2. NEEDTOSYNCREQUESTS 中的 ShipmentId 列具有值,而 LASTSYNCEDREQUEST 表中的 ShipmentId 列为 NULL。
  3. 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/

相关文章:

sql - 我如何在我的 SQL Server Profiler 上关闭来自 "Report Server"的行?

sql-server - 只能从 xml 变量中获取标签下的第一条记录

ruby-on-rails-4 - 我如何将 ruby​​ on Rails 与 Windows 上的 sql server 连接起来

sql-server - 带有子查询的 INSERT 的原子性

sql - 如何在 SQL Server 中选择前 100 个字符?

SQL Server - 事务在错误时回滚?

sql - 向 postgresql 插入唯一值

php - 使用 Active Record 构建查询的优缺点

sql-server - 从 Excel 电子邮件附件更新 SQL Server (2014) 表

sql-server - 如何在 SQL Server 中使用连接进行更新查询?