【问题标题】:MySQL query to find records that don't exist with multiple duplicate valuesMySQL查询以查找具有多个重复值的不存在的记录
【发布时间】:2023-03-11 10:13:01
【问题描述】:

我有两个相似的表,我需要找到存在于一个表中但不存在于另一个表中的任何记录,但我必须找到这些记录的唯一值有多个重复值。

表 1:

TId Date TYPE AMOUNT 1 2014-02-01 23 25.34 2 2014-02-01 23 46.95 3 2014-02-01 23 46.95 4 2014-02-01 23 25.34 5 2014-02-01 23 21.01

表 2:

TId Date TYPE AMOUNT 7 2014-02-01 23 25.34 8 2014-02-01 23 46.95 9 2014-02-01 23 21.01

我需要查询这两个表以从表 1 中找到记录 3 和 4。问题是我在表 2 的记录 7 和 8 中找到匹配项。我使用了“NOT EXISTS”和“JOIN”但似乎无法得到我正在寻找的结果。

【问题讨论】:

  • 想要的结果是什么?区分的条件是什么?
  • 期望的结果是从表 1 返回记录 3 和 4。
  • 好的,但是区分它们的条件/业务逻辑是什么?
  • 两组数据,PO系统和银行对账单。我需要找到银行对账单上但不在 PO 系统中的记录。问题是大多数购买的金额相同。在示例数据中,表 1 中有银行对账单,表 2 中有 pos。我需要找到出现在银行对账单上但不在 PO 系统中的金额。我不在乎它是什么记录,只在乎金额,以便客户可以调查哪一个没有输入到 PO 系统中。

标签: mysql select join duplicates


【解决方案1】:

我不是 100% 确定您要查找什么,但听起来您希望根据日期、类型和金额,在表 1 中找到不在表 2 中的记录。

如果是这样,左连接并检查字段上的 NULL 可能是最好的方法:-

SELECT table1.*
FROM table1
LEFT OUTER JOIN table2
ON table1.Date = table2.Date
AND table1.Type = table2.Type
AND table1.Amount = table2.Amount
WHERE table2.TId IS NULL

可能像这样(取决于您的具体要求)。这应该从 table1 中获取所有记录,并将其与日期、类型和金额匹配且 tid 是该记录的第一个记录的记录连接起来。然后加入对table2。如果table2上没有匹配的记录,或者有匹配但table1上的记录不是第一个匹配的记录。

只有在 table2 上没有重复项时才有效。

SELECT table1.*
FROM table1
LEFT OUTER JOIN
(
    SELECT Date, TYPE, AMOUNT, MIN(TId) AS TId
    FROM table1 
) t11
ON table1.Date = t11.Date
AND table1.Type = t11.Type
AND table1.Amount = t11.Amount
AND table1.TId = t11.TId
LEFT OUTER JOIN table2
ON table1.Date = table2.Date
AND table1.Type = table2.Type
AND table1.Amount = table2.Amount
WHERE (t11.TId IS NULL
AND table2.TId IS NOT NULL)
OR table2.TId IS NULL

【讨论】:

  • 这很有帮助,但它仍然会在 table2 7 和 8 中找到 table1 3 和 4 的匹配项。
  • 但那些是匹配的。您需要使用什么来确定某项是否匹配?
  • 我认为这是问题所在,我没有太多数据可以处理。我需要唯一匹配数据,所以记录 7 匹配记录 1,那么它不应该匹配记录 4。一旦找到匹配项,就不应再次使用它。
  • 啊,对。使它更复杂一些。会有戏
猜你喜欢
  • 2012-08-04
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
相关资源
最近更新 更多