MYSQL:表之间的差异

时间:2011-09-10 14:58:37

标签: mysql

我有两张桌子:

  • 产品

  • products_tmp

products_tmp表的字段较少。但是products_tmp中的所有字段都在产品中。

在导入数据时,我填充了products_tmp表,之后我需要做3件事:

  1. 检查products_tmp中不在产品中的新产品(获取ID)(完成)

  2. 检查不在products_tmp的产品中的旧产品(获取以后删除的ID)(完成)

  3. 检查其余部分的差异。两个表都有一个产品哈希唯一标识符。

  4. 我需要检查字段titletextpricephotoscategory_id中的差异。获取tmp ID,然后我可以使用新值更新products表。

    是否可以仅在mysql中执行diff?

1 个答案:

答案 0 :(得分:5)

  1. 检查products_tmp中不在产品中的新产品(获取ID)(DONE)
  2. 这是直截了当的......

    SELECT pt.*
    FROM products_tmp pt
    LEFT JOIN products p ON p.product_id = pt.product_id
    WHERE p.product_id IS NULL;
    
    1. 检查不在products_tmp中的旧产品(获取以后删除的ID)(完成)
    2. 总是更喜欢交换表格来执行RIGHT JOINS - 个人偏好......

      SELECT p.*
      FROM products p
      LEFT JOIN products_tmp pt ON p.product_id = pt.product_id
      WHERE pt.product_id IS NULL;
      

      3.检查其余部分的差异。两个表都有一个产品哈希唯一标识符。

      这个有点困难。假设你不想进行逐场比较,你可以这样做......

      SELECT product_id, count(*) cnt
      FROM (
          SELECT p.product_id, p.field2, p.field3
          FROM products p
          UNION
          SELECT pt.product_id, pt.field2, pt.field3
          FROM products_tmp pt
      ) pd
      GROUP BY product_id
      HAVING cnt > 1;
      

      UNION自然应该将重复项连接到一行,因此基于主键计数为2的任何内容都应该是重复行。如果将结果放入临时表中,则可以执行更多查询以查看差异。