如何使用多个字段

时间:2017-07-26 12:45:44

标签: sql sql-server distinct

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

我有这样的请求:

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'无效   用于架构绑定。名称必须是两部分格式和对象   不能自我介绍

4 个答案:

答案 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字段。由于每行应该是唯一的,因此无法对其他字段进行分组。从查询中删除它,你应该没事。

当您执行不同的查询时,诀窍是查看结果并查找哪些列返回不同的值,这就是区分它们的原因。如果您在问题中添加结果,我们可以为您提供进一步的帮助。