2009-09-29 99 views
0

當查找不同的行時,最好的方法是什麼?返回所有字段和不同行

SELECT DISTINCT name, address 
    FROM table; 

我仍然想要返回所有字段,即地址1,城市等,但不包括他們在DISTINCT行檢查。

回答

1

這不會混合和匹配您的城市,州等並應該給你最後一個補充:

select b.* 
from (
    select max(id) id, Name, Address 
    from table a 
    group by Name, Address) as a 
inner join table b 
on a.id = b.id 
0

你可以做

SELECT DISTINCT Name, Address, Max (Address1), Max (City) 
FROM table 

使用@JBrooks回答以下。他有更好的答案。

Return all Fields and Distinct Rows

+0

很酷謝謝。謝謝其他人。這就是我所追求的。 選擇名稱,最大(地址),最大(城市),最大(州),最大(郵編),最大(電話),最大(傳真)從地點GROUP BY名稱; – madphp 2009-09-29 13:28:41

+0

這是你想要的嗎?如果你有一個給定名稱Wilm,DE和Newark的行,那麼PA會返回Wilm,PA – JBrooks 2009-09-29 13:32:48

+1

@JBrooks是正確的,你將通過使用MAX或MIN或任何聚合函數得到不正確的值。你真的應該確定在重複的情況下應該發生什麼並應用該邏輯。 – 2009-09-29 13:35:46

2

然後,你必須決定何時有與你想要的不同的檢查要檢查的列的值相同的多個行做什麼,但具有不同的VAL;在其他列的UE。在這種情況下,查詢處理器如何知道要輸出其他列中的多個值中的哪一個值(如果您不在意),那麼只需在不同的列上編寫一個組,然後在所有列上使用Min()或Max()其他的..

編輯:我同意別人的意見,只要你在同一個表中有多個依賴列(例如Address1,Address2,City,State)這種方法會給你混合(並因此不一致)的結果。如果表中的每個列屬性都是獨立的(如果地址全部在地址表中,並且只有AddressId在該表中),那麼它不是一個重要的問題......至少導致從加入到地址表的所有列將生成相同地址的日期,但你仍然得到一個或多或少隨機選擇的一組多個地址...

0

我不認爲你可以這樣做,因爲它並不真正使感。

name | address | city | etc... 
abc | 123  | def | ... 
abc | 123  | hij | ... 

,如果你要包括城市,但又不希望它爲不同的條款的一部分,除非你不喜歡的東西MAX(市)城市價值將是不可預測的。

1

如果您有一組混合的字段,其中一些您希望成爲DISTINCT,而另一些您只想顯示,則需要彙總查詢而不是DISTINCT。 DISTINCT僅用於返回相同字段集的單個副本。像這樣的東西可能會工作:

SELECT name, 
     GROUP_CONCAT(DISTINCT address) AS addresses, 
     GROUP_CONCAT(DISTINCT city) AS cities 
FROM the_table 
GROUP BY name; 

以上將得到每個名稱的一行。 addresses包含該名稱的所有地址的一個逗號分隔字符串。 cities對所有城市都是一樣的。

但是,我不明白這個查詢的結果是如何有用的。將不可能知道哪個地址屬於哪個城市。

如果您經常遇到這種情況,試圖創建一個將以您需要的格式輸出行的查詢,那麼您最好接受多行,然後在應用程序層中處理查詢結果。

+0

+1,因爲SQL沒有必要爲您做所有事情。這解決了我的問題。謝謝! – John 2010-03-08 22:06:27

0

如果您使用SQL Server 2005或以上,您可以使用RowNumber函數。這將爲您獲得每個名稱的ID最低的行。如果您想通過更多列進行「分組」,請將它們添加到RowNumber的PARTITION BY部分中。

SELECT id, Name, Address, ... 
(select id, Name, Address, ..., 
    ROW_NUMBER() OVER (PARTITION BY Name ORDER BY id) AS RowNo 
    from table) sub 
WHERE RowNo = 1