2011-09-17 35 views
19

我需要查询表以便返回行,但我无法正确查询表。这里是我的表视图:如何根据A COLUMN的不同值选择行

Id    MailId   EmailAddress   Name 
1     1    [email protected]    Mr. A 
2     1    [email protected]    Mr. B 
3     1    [email protected]    Mr. C 
4     1    [email protected]    Mr. D 
5     1    [email protected]    Mr. A 


6     2    [email protected]    Mr. E 
7     2    [email protected]    Mr. A 
8     3    [email protected]    Mr. F 
9     4    [email protected]    Mr. D 

10    5    [email protected]    Mr. F 
11    6    [email protected]    Mr. D 

结果集应该返回:

Id    MailId   EmailAddress   Name 
1     1    [email protected]    Mr. A 
2     1    [email protected]    Mr. B 
3     1    [email protected]    Mr. C 
4     1    [email protected]    Mr. D 

6     2    [email protected]    Mr. E 
8     3    [email protected]    Mr. F 

换句话说:首先,我要选择不同的电子邮件地址,然后返回一个包含不同的E-行邮件地址。

注意:只使用“Distinct”关键字在这里不起作用,因为它会选择不同的行。我的要求是选择不同的电子邮件地址,然后选择包含这些地址的行。

编辑:我也不能使用“Group By”关键字,因为为此我还需要将Group By与Id(这是PK)并且这样做会返回两个具有相同EmailAddress值的行,但与不同的Ids。

+1

为什么你不使用GROUP BY EmailAddress ...如果你通过你的PK进行分组,它不会做任何事情,因为主键总是唯一的,所以group by statement不会做任何事情..如果你通过emailAddress使用group获得与您指定的结果相同的结果... – blejzz

+1

您似乎想要为这两个选择不同的EmailAddress和Name以及第一个匹配的Id,MailId。那是对的吗?我也很好奇如何使用Id和MailId。 –

+1

通过主键分组毫无意义。分组会删除重复的值。主键按定义不能有重复。 – Thilo

回答

1

如果你不想要使用DISTINCT使用GROUP BY

SELECT * FROM myTABLE GROUP BY EmailAddress 
+0

PLZ看到我编辑的问题。谢谢 – user576510

+1

看到我的评论,我的答案返回你想要的结果。 – blejzz

+13

它返回错误消息8120,级别16,状态1,行1 列'EmailContact.RowId'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。 – user576510

41

看你的输出,也许下面的查询可以工作,试试看:

SELECT * FROM tablename 
WHERE id IN 
(SELECT MIN(id) FROM tablename GROUP BY EmailAddress) 

这将选择只有一行每个不同的电子邮件地址,行最低id这是你的结果似乎描绘

+0

谢谢!我不知道为什么这不是标记为正确的答案 –

+0

我认为你需要包含名称字段,而不仅仅是电子邮件地址,尽管他没有一个例子。 – Beth

13

试试这个 - 你需要一个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

使用这个(假设你的表名是电子邮件):

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 

希望这有助于..

0

我不确定你的DBMS。所以,我在红移,并从我的经验创建的临时表,我觉得这个查询应该返回你在找什么:

select min(Id), distinct MailId, EmailAddress, Name 
    from yourTableName 
    group by MailId, EmailAddress, Name 

我看到,我使用的是GROUP BY clause,但你还是不会有两行针对任何特定的MailId