SQL 比较两个相同表的差异

问题描述 投票:0回答:1

我的网站包含超过 60,000 种产品,我每周都会从制造商那里获得更新,我需要处理这些更新,以便我可以更新我的网站。我有 php 代码来加载各种相关表。

我有两个相同的表 - 一个有我上周应用程序运行的(已保存)每周产品更新,另一个有每周产品更新。这两个表都有 71 列,因此它们都有点大。两个表中都有一列保存状态 - 无论这是新产品、有一些更改(描述、价格等)的现有产品,还是自上周以来保持不变的现有产品。

我正在努力寻找一种仅使用 SQL 的方法来查找新表中的行:

  • 是新的且不在旧表中,并且更新这些行的状态列包含“新”
  • 在两个表中,但与旧表相比,新表已更新/更改数据,并且 更新这些行的状态列为“已更改”
  • 在两个表中都相同,并且更新这些行的状态列为“相同”

目标是,在我运行这个难以捉摸的 SQL 后,新表中的所有行都将在状态列中具有这三个值之一,因此我可以将它们加载到我的站点中。

我已经有了 SQL 来确定旧表中的哪些产品(上周运行的产品)不在本周的新表中,因此需要删除(不再是当前产品) - 因此最后的逻辑结果是已处理。

我目前有 php 代码,可以将新表中的每个产品与旧表中的相同产品进行比较,以执行此操作 - 我正在比较每一行的 29 列,因此需要几个小时才能完成,并且因此,这对我们的流程来说是一个问题。

是否有 SQL 方法来比较这两个表并更新状态列?即使这意味着为每个状态结果运行 3 个单独的 SQL 查询?我怀疑有,这会节省时间,但我自己无法解决这个问题。

预先感谢您的帮助!

sql mysql mysqli mariadb
1个回答
0
投票

您可以为此使用联合更新。

使用

EXCEPT
的子查询(子查询中没有
FROM
)将告诉您是否有任何列已更改。

UPDATE NewTable
LEFT JOIN OldTable ot ON ot.YourPK = NewTable.YourPK
SET NewTable.Status =
    CASE WHEN ot.YourPK IS NULL THEN 'New'
         WHEN EXISTS (
             SELECT NewTable.Column1, NewTable.Column2
             EXCEPT
             SELECT ot.Column1, ot.Column2
         ) THEN 'Changed'
         ELSE 'Same'
    END;
© www.soinside.com 2019 - 2024. All rights reserved.