2011-09-17 69 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