Mysql 只返回两个表之间存在差异的记录

Posted

技术标签:

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

这里是之前question的扩展

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

StockNumber, StockLevel

我怎么知道

    仅 StockNumber 的 StockLevel 存在差异 返回受影响的 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" 没有变化,也没有返回。

非常感谢,

马特

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Mysql 只返回两个表之间存在差异的记录的主要内容,如果未能解决你的问题,请参考以下文章

具有不同表结构的两个DB2表中的数据值之间的差异

检查mysql表php中是不是存在任何记录

比较两个迭代器并检查哪些元素被添加,删除或两者之间相同

MySQL 查询版本控制表中存在多个版本记录如何实现只取最大版本号对应记录

视图和内联表函数之间是不是存在性能差异?

CTE、子查询、临时表或表变量之间是不是存在性能差异?