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

Sql 如何使用多个字段进行区分,sql,sql-server,distinct,Sql,Sql Server,Distinct,我的数据库中有一些重复的邮件,但我无法删除它。 我想选择一些字段,但没有重复邮件 我有这样的要求: SELECT DISTINCT MAIL, ID, CIVILITE, PRENOM, NAME FROM CONTACT WHERE CODE_PAYS = 'DE' 当我启动此请求时,邮件上的重复值已经存在 你知道我怎么做吗 更新:我已经尝试过这种方法,但我需要从以下角度使用它: ALTER VIEW ALL_VW_CONTACT_DE WITH SCHEMABINDING AS wit

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

我有这样的要求:

SELECT 
DISTINCT MAIL,
ID,
CIVILITE,
PRENOM,
NAME
FROM CONTACT WHERE CODE_PAYS = 'DE'
当我启动此请求时,邮件上的重复值已经存在

你知道我怎么做吗

更新:我已经尝试过这种方法,但我需要从以下角度使用它:

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”无效 用于模式绑定。名称必须采用两部分格式,并且必须是一个对象 无法引用自身

当我启动此请求时,邮件上的重复值已被删除 在这里

原因是DISTINCT不像你想象的那样工作。它不仅查看DISTINCT关键字后的第一列,还比较列表中的所有列。所以,只要所有的都相等,它就被认为是重复的

一种简单的方法是使用行号:

如果您想获取不同的记录,请更改顺序,这里我将获取具有min-ID的记录

当我启动此请求时,邮件上的重复值已被删除 在这里

原因是DISTINCT不像你想象的那样工作。它不仅查看DISTINCT关键字后的第一列,还比较列表中的所有列。所以,只要所有的都相等,它就被认为是重复的

一种简单的方法是使用行号:


通过更改顺序,如果您想要获取不同的记录,这里我将获取具有min-ID的记录。

当您将DISTINCT与其他字段一起使用时,将仅获取这些字段的原始组合

对于这种情况,您应该从查询ID中排除所有动态字段:

SELECT 
DISTINCT MAIL,
CIVILITE,
PRENOM,
NAME
FROM CONTACT WHERE CODE_PAYS = 'DE'

如果将DISTINCT与其他字段一起使用,则只会得到这些字段的原始组合

对于这种情况,您应该从查询ID中排除所有动态字段:

SELECT 
DISTINCT MAIL,
CIVILITE,
PRENOM,
NAME
FROM CONTACT WHERE CODE_PAYS = 'DE'

您可以使用下面的行号

Select top (1) with ties * from Contact
   where CODE_PAYS = 'DE'
   order by row_number() over(partition by mail order by id)

您可以使用下面的行号

Select top (1) with ties * from Contact
   where CODE_PAYS = 'DE'
   order by row_number() over(partition by mail order by id)

这里的问题可能是ID字段。因为每一行都应该是唯一的,所以不能对其他字段进行分组。从查询中删除它,您应该会没事的


当您执行一个不同的查询时,诀窍是查看结果并找到返回不同值的列,这就是它们的区别所在。如果您在问题中添加结果,我们可以进一步帮助您

这里的问题可能是ID字段。因为每一行都应该是唯一的,所以不能对其他字段进行分组。从查询中删除它,您应该会没事的


当您执行一个不同的查询时,诀窍是查看结果并找到返回不同值的列,这就是它们的区别所在。如果您在问题中添加结果,我们可以进一步帮助您

添加示例数据预期输出alsoDistinct应用于所有字段。不仅仅是它旁边的那个。因此,它确保只有一行具有相同的邮件、id、civilite、prenom和名称组合。可以仅在“我的现场邮件”中添加不同的名称吗?请显示一些示例数据。如果返回了多条记录,如何确定要保留的内容?添加示例数据预期输出alsoDistinct应用于所有字段。不仅仅是它旁边的那个。因此,它确保只有一行具有相同的邮件、id、civilite、prenom和名称组合。可以仅在“我的现场邮件”中添加不同的名称吗?请显示一些示例数据。如果您有多条记录被返回,您如何决定保留什么?我可以将代码支付的条款放在哪里?当我在dbo之后。联系这个不是吗working@dutycorpse:在公用表表达式中,我编辑了我的应答。我有一个错误:无法架构绑定视图“my_table”,因为名称“CONTACT”对架构绑定无效。名称必须采用两部分格式,并且对象不能引用itself@dutycorpse:您是否如我所示使用了dbo.Contact或仍然使用了Contact?我使用了dbo.Contact。我可以将代码的子句放在哪里?当我在dbo之后。联系这个不是吗working@dutycorpse:在公用表表达式中,我编辑了我的应答。我有一个错误:无法架构绑定视图“my_table”,因为名称“CONTACT”对架构绑定无效。名称必须采用两部分格式,并且对象不能引用itself@dutycorpse:您是否如我所示使用了dbo.Contact或仍然使用了Contact?我使用了dbo.Contact