Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确保在SQL Server中返回多个数据时仅返回一条记录_Sql_Sql Server - Fatal编程技术网

确保在SQL Server中返回多个数据时仅返回一条记录

确保在SQL Server中返回多个数据时仅返回一条记录,sql,sql-server,Sql,Sql Server,我已经尝试了一段时间,但似乎无法让它工作。我认为需要一些其他SQL Server功能或标准才能使其正常工作 我有以下示例数据集: Test1@gmail.com FirstName LastName Test1@gmail.com DiffFirstName DiffLastName MyOtherEmail@gmail.com Jane Doe MyOtherEmail@gmail.com John Doe MyOtherEmail@gmail.com Jack Doe 我需要的是,返回的数

我已经尝试了一段时间,但似乎无法让它工作。我认为需要一些其他SQL Server功能或标准才能使其正常工作

我有以下示例数据集:

Test1@gmail.com FirstName LastName
Test1@gmail.com DiffFirstName DiffLastName
MyOtherEmail@gmail.com Jane Doe
MyOtherEmail@gmail.com John Doe
MyOtherEmail@gmail.com Jack Doe
我需要的是,返回的数据,我们只采取第一行是电子邮件是重复的,另一个是丢弃,因为我们不需要它。因此,这将是所选的返回集:

Test1@gmail.com FirstName LastName
MyOtherEmail@gmail.com Jane Doe
我尝试了分组方式、Over、Partition by和Temp表,但似乎无法让所有的名称都返回

任何帮助都将不胜感激

多谢各位


Dennis将int ID添加到表中。 让它成为你桌子的主键。 任何一张桌子都需要PK,而你 没有适合PK的列

那就这样做吧

select t1.* from
TableName t1
inner join 
(
    select t0.email, min(t0.id) as id 
    from TableName t0
    group by t0.email
) t2 on t1.id = t2.id 

向表中添加一个int-ID。 让它成为你桌子的主键。 任何一张桌子都需要PK,而你 没有适合PK的列

那就这样做吧

select t1.* from
TableName t1
inner join 
(
    select t0.email, min(t0.id) as id 
    from TableName t0
    group by t0.email
) t2 on t1.id = t2.id 

给你。您甚至不需要修改表结构,尽管您可能仍然需要修改。


分区内部的顺序将决定哪些记录浮到顶部。我使用LastName进行排序。把它换成你想要的任何东西。

给你。您甚至不需要修改表结构,尽管您可能仍然需要修改。

分区内部的顺序将决定哪些记录浮到顶部。我使用LastName进行排序。将其更改为您想要的任何内容。

使用。修改ORDER BY子句以满足您的需要

除了使用替代子查询之外,与类似。注意答案中提到的差异

使用。修改ORDER BY子句以满足您的需要


除了使用替代子查询之外,与类似。注意答案中提到的差异

我认为DISTINCT关键字可能就是您要找的。

我认为DISTINCT关键字可能就是您要找的。

尝试TOP 1限制您的结果您将使用什么标准对名称进行排序以确定哪一个是第一个?表是否有唯一的可以使用的主键字段?尝试TOP 1限制您的结果什么您将使用标准对名称进行排序以确定哪一个是第一个?该表是否具有可使用的唯一主键字段?DISTINCT将处理这三个重复的行。但它无法解决这两个问题:Test1@gmail.com姓Test1@gmail.comDiffFirstName DifflastName谢谢Keith。我一定是看错了他的问题。我以为他想要不同的电子邮件地址。我通常会按该列对它们进行分组,并提取不同的地址。distinct将处理这三个重复的行。但它无法解决这两个问题:Test1@gmail.com姓Test1@gmail.comDiffFirstName DifflastName谢谢Keith。我一定是看错了他的问题。我以为他想要不同的电子邮件地址。我通常会把他们按那个列分组,然后找出不同的地址。
WITH contacts as (
  SELECT ROW_NUMBER() OVER(PARTITION BY email ORDER BY first_name) AS row,
         email, first_name, last_name
  FROM contact
)
SELECT * FROM contacts where row = 1;