SQL:删除具有重复值的所有行

时间:2016-02-25 16:27:11

标签: sql ms-access-2007

我有一张包含列的表格:

Acct_no, PSTL_CODE, NAME, phone

我试图摆脱共享相同PSTL_CODE 电话的所有行(即转储那些与他/她相同的电话)。她的帐户,以及类似的情况)

我已经将以下内容拉到了一起,我认为应该只返回具有唯一PSTL_CODE的行:

SELECT * FROM Sheet1
WHERE PSTL_CODE IN
(SELECT PSTL_CODE FROM SHEET1
GROUP BY PSTL_CODE HAVING COUNT(PSTL_CODE) =1)
ORDER BY phone

并且 close-ish ,但它仍然返回一行,其中有两个帐户位于同一个PSTL_CODE。

而且我一直坚持使用Access 2007,所以我无法做到:

SELECT * FROM Sheet1
EXCEPT
(SELECT PSTL_CODE FROM SHEET1
GROUP BY PSTL CODE HAVING COUNT(*) >1)
ORDER BY phone

为了躲开倍数。

帮助!

3 个答案:

答案 0 :(得分:0)

尝试使用Exists

考虑到您的独特组合为PSTL_CODEphone

SELECT * 
FROM   sheet1 a 
WHERE  EXISTS (SELECT 1 
               FROM   sheet1 b 
               WHERE  a.pstl_code = b.pstl_code 
                      AND a.phone = b.phone 
               HAVING Count(*) = 1) 
ORDER  BY phone 

最好在Unique ConstraintPSTL_CODE列上定义phone,以帮助您避免表格中的重复记录

答案 1 :(得分:0)

如果我正确理解了业务逻辑,那么您正试图从查询中消除共同生活的夫妻。您正在通过电话进行分组,这似乎导致了错误。两个人住在同一个地方但有不同的电话号码是否有合理的商业原因。比如手机?

答案 2 :(得分:0)

一种方法是生成一组唯一的电话,邮政编码是重复的,然后将您的基本集合LEFT加入到postal_Code为空的生成集合中。

Select *
FROM SHEET1 A
LEFT JOIN (
  Select count(*) as cnt pstl_Code, phone
  From sheet1
  group by pstl_Code, phone 
  having count(*) > 1) B
 on A.Pstl_Code = B.Pstl_Code
and A.Phone = B.Phone
where B.pstl_Code is null and b.phone is null