【问题标题】:Mysql Query to display not matched records from both tables like old record and new recordMysql Query 显示两个表中不匹配的记录,如旧记录和新记录
【发布时间】:2019-02-06 02:06:01
【问题描述】:

我有两张两张表,一张是临时表,另一张是主表。在进行最终处理之前,用户单击刷新按钮。然后我将数据填充到临时表中,如果两个表(如旧值 - 新值)之间存在任何差异,则需要向用户显示。为此,我尝试了以下查询,但无法获得旧值。我得到了 null

Temporay table

+------+--------------+----------------+-----+
| asn        |       ean |   belegnr |quantity|
+------+--------------+----------------+-----+
|  700000845 | 4046228201122| 30059314 |2  |
|  700000845 | 4046228138879| 30059314 |3  |
|  700000845 | 4046228138875| 30059320 |25 |
+------+--------------+----------------+--+--+

主表

+------+--------------+----------------+-----+
| asn        |       ean |   belegnr |quantity|
+------+--------------+----------------+-----+
|  700000845 | 4046228201122| 30059314 |5  |
|  700000845 | 4046228138879| 30059314 |3  |
|  700000845 | 4046228138888| 30059320 |25 |
+------+--------------+----------------+--+--+

从两个表中,我的 ean 字段和数量字段都有变化 为此,我正在使用此查询

SELECT
t2.id,t2.ean,t2.belegnr,t2.`quantity`,t1.`quantity`  FROM
temp_table  t2
LEFT OUTER JOIN details  t1 ON
t1.asn = t2.asn
AND t1.ean = t2.ean
AND t1.belegnr =  t2.belegnr
AND t1.quantity = t2.quantity
WHERE t2.asn = 700000845
AND t2.`belegnr` in(30059314,30059320)
AND t1.id IS NULL

以下是我的预期结果

+------+--------------+----------------+-----+---------------------- 
| asn        |       ean |    oldean|       belegnr |quantity|Oldqty|
+------+--------------+----------------+-----+----------------------|
|  700000845 | 4046228201122| 4046228201122 |30059314 |2  |   5     |
|  700000845 | 4046228138875| 4046228138888 |30059320 |25  |  25    |
+------+--------------+----------------+--+--+--------+-------------+

任何帮助将不胜感激。

【问题讨论】:

  • 这些表中是否有链接条目的id 字段?否则你想要的结果是无法实现的(没有办法阻止它尝试匹配两个表中具有belegnr = 30059314 的两行)。
  • @Nick,asn 编号在两个表中都很常见,id 也在两个表中
  • 如果两个表中的 id 相同,则加入。
  • @danblack,没有 id 不一样。因为那是临时表,处理临时表中的数据将被刷新
  • 您的问题无法像@Nick 所说的那样回答,没有可靠的连接标准。为什么您有一个临时表要与“旧版本”进行比较'也许可以解决。

标签: mysql join left-join


【解决方案1】:

一旦您加入,您就消除了您想称为“旧”的 t1 行。

假设 asn 是常数:

SELECT
t2.asn,t2.ean,t1.ean as oldean,t2.belegnr,t1.belegnr as oldbelegnr, t2.`quantity`,t1.`quantity` as Oldqty
FROM temp_table  t2
JOIN details  t1 ON t1.asn = t2.asn
WHERE
t1.ean <> t2.ean
OR t1.belegnr <>  t2.belegnr
OR t1.quantity <> t2.quantity

【讨论】:

  • 行的通用标准到底是什么?你的查询有t2.id,但没有提到id
  • asn 值在两个表中都很常见
  • 请看这个屏幕截图。这正是我从您的查询中得到的。甚至我也添加了 DISTINCT 关键字。 prntscr.com/mh7ekp
  • 关于 t2.id,我只是用它来显示
  • 两个表中有多个 asns 可能会出现重复。所以真的 asn 不是唯一的 JOIN 标准,但你期待其他领域的差异。您是否期望每行最多有 1 个差异?如果有两个呢?
【解决方案2】:

没有答案。评论太长了...

注意,如果数据集如下,这个问题理解起来也一样难……

临时表

+-----+-----+-----------+-------+
| asn | ean  |   belegnr |quantity|
+-----+-----+------------+-----+
|  845 | 1122|      14 |     2  |
|  845 | 8879|      14 |     3  |
|  845 | 8875|      20 |    25 |
+-----+------+-----------+-------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多