我需要查询一个表才能返回行,但是我无法正确查询表。这是我的表格视图:
Id MailId EmailAddress Name
1 1 a@a.com Mr. A
2 1 b@b.com Mr. B
3 1 c@c.com Mr. C
4 1 d@d.com Mr. D
5 1 a@a.com Mr. A
6 2 e@e.com Mr. E
7 2 a@a.com Mr. A
8 3 f@f.com Mr. F
9 4 d@d.com Mr. D
10 5 f@f.com Mr. F
11 6 d@d.com Mr. D
结果集应返回:
Id MailId EmailAddress Name
1 1 a@a.com Mr. A
2 1 b@b.com Mr. B
3 1 c@c.com Mr. C
4 1 d@d.com Mr. D
6 2 e@e.com Mr. E
8 3 f@f.com Mr. F
换句话说:首先,我想选择不同的电子邮件地址,然后返回包含不同电子邮件地址的行。
注意:仅使用“Distinct”关键字不起作用,因为它会选择不同的行。我的要求是选择不同的电子邮件地址,然后选择包含这些地址的行。
编辑:我也不能使用“分组依据”关键字,因为为此我还必须使用ID(这是PK)进行分组,并且执行此操作将返回两行相同的EmailAddress值但具有不同的ID。
答案 0 :(得分:54)
查看您的输出可能以下查询可以正常工作,尝试一下:
SELECT * FROM tablename
WHERE id IN
(SELECT MIN(id) FROM tablename GROUP BY EmailAddress)
这将为每个不同的电子邮件地址仅选择一行,最小id
的行就是您的结果似乎描绘的
答案 1 :(得分:16)
尝试这一点 - 您需要一个CTE(公用表表达式),它通过不同的电子邮件地址对数据进行分区(分组),并按ID对每个组进行排序 - 首先是最小的。然后,您只需为每个组选择第一个条目 - 这应该为您提供所需的内容:
;WITH DistinctMails AS
(
SELECT ID, MailID, EMailAddress, NAME,
ROW_NUMBER() OVER(PARTITION BY EMailAddress ORDER BY ID) AS 'RowNum'
FROM dbo.YourMailTable
)
SELECT *
FROM DistinctMails
WHERE RowNum = 1
这适用于SQL Server 2005及更新版(您没有提及您正在使用的版本 ...)
答案 2 :(得分:2)
使用此(假设您的表名是电子邮件):
select * from emails as a
inner join
(select EmailAddress, min(Id) as id from emails
group by EmailAddress ) as b
on a.EmailAddress = b.EmailAddress
and a.Id = b.id
希望这有帮助..
答案 3 :(得分:0)
我不确定你的DBMS。所以,我在Redshift中创建了一个临时表,根据我的经验,我认为这个查询应该返回你想要的内容:
select min(Id), distinct MailId, EmailAddress, Name
from yourTableName
group by MailId, EmailAddress, Name
我发现我使用的是GROUP BY clause
,但您仍然没有针对任何特定MailId
的两行。
答案 4 :(得分:-2)
如果您不想使用DISTINCT,请使用GROUP BY
SELECT * FROM myTABLE GROUP BY EmailAddress