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
)或昨天不存在的股票(这是LEFT
和IS NULL
的用途):
SELECT Today.*
FROM Today LEFT JOIN Yesterday
ON Today.StockNumber = Yesterday.StockNumber
WHERE
Today.StockLevel <> Yesterday.StockLevel
OR Yesterday.StockLevel IS NULL
【讨论】:
以上是关于Mysql 只返回两个表之间存在差异的记录的主要内容,如果未能解决你的问题,请参考以下文章