【问题标题】:Mysql return only records that have differences between two tablesMysql 只返回两个表之间存在差异的记录
【发布时间】:2013-02-24 16:14:40
【问题描述】:

这里是之前question的扩展

我有两张桌子,昨天和今天,每张桌子有两列

StockNumber, StockLevel

我怎么知道

  1. 仅 StockNumber 的 StockLevel 存在差异
  2. 返回受影响的 StockNumber 和 StockLevel 值

例如:

今天的表:

StockNumber, StockLevel
ABC, 10
CBA,5
123,5

昨天的表:

StockNumber, StockLevel
ABC, 9
CBA,5
123,10

返回以下wi

StockNumber, StockLevel
ABC, 10
123, 5

现在注意到 StockNumber "ABC" 正在返回今天的值 10,而 StockNumber "123" 也在返回今天的值 5 并且 StockNumber "CBA" 没有变化,也没有返回。

非常感谢,

马特

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    这将适用于两天都存在的股票;

    SELECT t.StockNumber, t.StockLevel
    FROM today t
    JOIN yesterday y
      ON t.StockNumber=y.StockNumber
     AND t.StockLevel <> y.StockLevel
    

    如果您(如您之前的问题)还希望包括今天的新股票;

    SELECT t.StockNumber, t.StockLevel
    FROM today t
    LEFT JOIN yesterday y
      ON t.StockNumber = y.StockNumber
    WHERE y.StockNumber IS NULL 
       OR t.StockLevel <> y.StockLevel
    

    An SQLfiddle to test both with.

    【讨论】:

      【解决方案2】:

      您可以加入 StockNumber 上的表格并选择这些行 WHERE NOT A.StockLevel = B.StockLevel

      【讨论】:

        【解决方案3】:

        这有点棘手,因为您可能在两个表中有不同的项目。为此,我建议使用 union all 和 group by:

        select stockNumer,
               max(case when which = 'yesterday' then stocklevel end) as yesterdaylevel,
               max(case when which = 'today' then stocklevel end) as todaylevel
        from ((select StockNumber, StockLevel, 'yesterday' as which
               from yesterday
              ) union all
              (select StockNumber, StockLevel, 'today' as which
               from today
              )
             ) t
        group by stockNumber
        having min(StockLevel) <> max(stockLevel) and count(*) = 2
        

        【讨论】:

          【解决方案4】:
          select T.StockNumber, T.StockLevel 
          from Today as T 
          left join Yesterday as Y 
          on T.StockNumber = Y.StockNumber 
          WHERE T.StockLevel <> Y.StockLevel
          

          在这里玩结果:http://sqlfiddle.com/#!2/367b0/3/0

          【讨论】:

            【解决方案5】:

            以下查询将返回与昨天不同(StockLevel)或昨天不存在的股票(这是LEFTIS NULL 的用途):

            SELECT Today.*
            FROM Today LEFT JOIN Yesterday
                ON Today.StockNumber = Yesterday.StockNumber
            WHERE
                Today.StockLevel <> Yesterday.StockLevel
                OR Yesterday.StockLevel IS NULL
            

            【讨论】:

              猜你喜欢
              • 2015-01-16
              • 2011-01-05
              • 2021-03-18
              • 2011-12-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-11-20
              • 1970-01-01
              相关资源
              最近更新 更多