2009-09-29 71 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