我的网站包含超过 60,000 种产品,我每周都会从制造商那里获得更新,我需要处理这些更新,以便我可以更新我的网站。我有 php 代码来加载各种相关表。
我有两个相同的表 - 一个有我上周应用程序运行的旧(已保存)每周产品更新,另一个有新每周产品更新。这两个表都有 71 列,因此它们都有点大。两个表中都有一列保存状态 - 无论这是新产品、有一些更改(描述、价格等)的现有产品,还是自上周以来保持不变的现有产品。
我正在努力寻找一种仅使用 SQL 的方法来查找新表中的行:
目标是,在我运行这个难以捉摸的 SQL 后,新表中的所有行都将在状态列中具有这三个值之一,因此我可以将它们加载到我的站点中。
我已经有了 SQL 来确定旧表中的哪些产品(上周运行的产品)不在本周的新表中,因此需要删除(不再是当前产品) - 因此最后的逻辑结果是已处理。
我目前有 php 代码,可以将新表中的每个产品与旧表中的相同产品进行比较,以执行此操作 - 我正在比较每一行的 29 列,因此需要几个小时才能完成,并且因此,这对我们的流程来说是一个问题。
是否有 SQL 方法来比较这两个表并更新状态列?即使这意味着为每个状态结果运行 3 个单独的 SQL 查询?我怀疑有,这会节省时间,但我自己无法解决这个问题。
预先感谢您的帮助!
您可以为此使用联合更新。
使用
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;