查找具有相同ID的行并且只保留一行的方法

时间:2011-07-22 15:20:47

标签: mysql sql database

我有一个可以从我的数据库中返回一些结果(记录)的工作查询,例如:

123|John Williams|IL|M|06/01/2011|ACTIVE
124|Mary Haque|NY|F|TERMINATED|06/30/2011
124|Mary Haque|NY|F|07/01/2011|ACTIVE
125|Alex Chan|VA|07/01/2011|ACTIVE
126|Rob Kreb|VA|TERMINATED|06/20/2011

如您所见,结果只是一个客户记录列表,而最后两个字段表示该成员是活动的还是已终止的以及相关的活动/终止日期。

现在的复杂情况是,正如你可以看到ID为124(Mary Haque)的成员,她有两条记录,对于这种双记录客户,我只想保留成员活动的行。完全无视她终止的历史。因此,例如,上述所需的输出应为:

123|John Williams|IL|M|06/01/2011|ACTIVE
124|Mary Haque|NY|F|07/01/2011|ACTIVE
125|Alex Chan|VA|07/01/2011|ACTIVE
126|Rob Kreb|VA|TERMINATED|06/20/2011

正如您所看到的,现在Mary Haque只有关于结果的有效信息。上面的结果是通过SQL“Select”查询生成的,但是我不能简单地在这个查询中附加一个“WHERE status = ACTIVE”,因为我仍然希望保留那些只有一个像Rob Kreb这样的记录的成员,即使他被终止。我只希望在某个成员有两条记录时对TERMINATED成员记录进行过滤。

仅供参考,我目前的查询如下:

SELECT * FROM customer_change WHERE CUSTOMER_LOGIN NOT IN(SELECT CUSTOMER_LOGIN FROM  customer_full WHERE CUSTOMER_LOGIN IS NOT NULL)
UNION
SELECT * FROM customer_change WHERE CUSTOMER_POINTS=0 AND CUSTOMER_LOGIN NOT IN(SELECT CUSTOMER_LOGIN FROM customer_full WHERE CUSTOMER_POINTS=0 AND CUSTOMER_LOGIN IS NOT NULL)

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

colXcolY是查询的最后两列:

SELECT *
FROM (your_UNION_query) AS p
WHERE NOT ( colX = 'TERMINATED'
          AND EXISTS
            ( SELECT *
              FROM (your_UNION_query) AS q
              WHERE q.id = p.id
                AND q.colY = 'ACTIVE'
            )
          )

答案 1 :(得分:0)

这样的事情可以解决问题:

DELETE
FROM tablename
WHERE tablename.status = 'TERMINATED'
    AND tablename.id IN(SELECT
                          id
                        FROM (SELECT
                                t.id
                              FROM tablename t
                              GROUP BY t.id
                              HAVING COUNT(t.id) > 1) AS T1)

假设id是引用124,125等的字段