2014-10-30 80 views
0

我有两个类似的表,我需要找到存在于一个表中但不是其他的记录,但唯一值我必须找到这些记录多个重复值。MySQL查询找到不存在多个重复值的记录

表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的问题是I” m在表2中的记录7和8中找到匹配。我使用'NOT EXISTS'和'JOIN',但似乎无法获得我期待的结果。

+0

想要的结果是什么?有什么区别的条件? – Rahul 2014-10-30 14:44:34

+0

希望的结果是将表1中的记录3和4返回。 – pwills 2014-10-30 14:52:59

+0

好,但区分它们的条件/业务逻辑是什么? – Rahul 2014-10-30 14:58:39

回答

0

我不是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 
+0

这是有帮助的,但它仍然在table2 7&8中找到table1 3&4的匹配。 – pwills 2014-10-30 15:34:27

+0

但是这些匹配。你需要用什么来确定是否匹配? – Kickstart 2014-10-30 15:40:32

+0

我认为这是问题,我没有太多数据可以使用。我需要唯一地匹配数据,所以记录7匹配记录1,然后它不应该匹配记录4.一旦找到匹配,它不应该再次使用。 – pwills 2014-10-30 15:45:51