我的数据库中有一些重复的邮件,但我无法将其删除。 我想选择一些字段但没有重复邮件。
我有这样的请求:
SELECT
DISTINCT MAIL,
ID,
CIVILITE,
PRENOM,
NAME
FROM CONTACT WHERE CODE_PAYS = 'DE'
当我启动此请求时,邮件上的重复值已经在此处。
你知道我该怎么办?
更新:我尝试了this方法,但我需要在视图中使用它:
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
但是这不起作用,我收到了这个错误:
无法对视图'MY_TABLE'进行架构绑定,因为名称'CONTACT'无效 用于架构绑定。名称必须是两部分格式和对象 不能自我介绍
答案 0 :(得分: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
如果您想拍摄不同的记录,请更改order by
,此处我选择带有min-ID的记录。
答案 1 :(得分:3)
你可以使用row_number,如下所示
Select top (1) with ties * from Contact
where CODE_PAYS = 'DE'
order by row_number() over(partition by mail order by id)
答案 2 :(得分:1)
当您将DISTINCT与其他字段一起使用时,您只能获得这些字段的原始组合。
对于这种情况,您应该从查询中排除所有动态字段(可能是ID):
SELECT
DISTINCT MAIL,
CIVILITE,
PRENOM,
NAME
FROM CONTACT WHERE CODE_PAYS = 'DE'
答案 3 :(得分:0)
这里的问题可能是ID字段。由于每行应该是唯一的,因此无法对其他字段进行分组。从查询中删除它,你应该没事。
当您执行不同的查询时,诀窍是查看结果并查找哪些列返回不同的值,这就是区分它们的原因。如果您在问题中添加结果,我们可以为您提供进一步的帮助。