如何使用多个字段进行区分

dut*_*pse 1 sql sql-server distinct

我的数据库中有一些重复的邮件,但我无法将其删除.我想选择一些字段,但没有重复的邮件.

我有这样的请求:

SELECT 
DISTINCT MAIL,
ID,
CIVILITE,
PRENOM,
NAME
FROM CONTACT WHERE CODE_PAYS = 'DE'
Run Code Online (Sandbox Code Playgroud)

当我启动此请求时,我的邮件重复值已经在这里.

你知道我怎么做的吗?


更新:我尝试过这种方法,但我需要在视图中使用它:

ALTER VIEW ALL_VW_CONTACT_DE WITH SCHEMABINDING 
AS
with cte as
(
   select rn = row_number() over (partition by c.Mail Order By c.Id asc), c.Mail, c.Id, c.Civilite, c.Prenom, c.Name
   from dbo.CONTACT c 
   where code_pays = 'DE'
)
select Mail, Id, Civilite, Prenom, Name
from cte
where rn = 1
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我得到这个错误:

无法模式绑定视图'MY_TABLE',因为名称'CONTACT'对于模式绑定无效.名称必须采用两部分格式,并且对象不能引用自身

Tim*_*ter 6

当我启动此请求时,我的邮件重复值已经在这里.

原因是它DISTINCT不像你想象的那样有效.它不仅仅查看DISTINCT关键字后面的第一列,而是比较列表中的所有列.所以,如果一切都是平等的,则认为它是重复的.

一种简单的方法是使用ROW_NUMBER:

with cte as
(
   select rn = row_number() over (partition by c.Mail Order By c.Id asc), c.*
   from dbo.Contact c
   where Code_Pays = 'DE'
)
select Mail, Id, Civilite, Prenom, Name
from cte
where rn = 1
Run Code Online (Sandbox Code Playgroud)

order by如果你想要一个不同的记录,请更改,在这里我拿一个带有min-ID的记录.