我有一个可以从我的数据库中返回一些结果(记录)的工作查询,例如:
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)
提前感谢您的帮助!
答案 0 :(得分:2)
colX
和colY
是查询的最后两列:
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等的字段