在寻找不同的行时,最好的方法是什么?
SELECT DISTINCT name, address
FROM table;
我仍然希望返回所有字段,即address1,city等,但不包括在DISTINCT行检查中。
答案 0 :(得分:2)
然后,当有多个行具有相同的值时,您必须决定要执行哪个行,您希望不同的检查要检查,但是使用不同的val;其他列中的ues。在这种情况下,查询处理器如何知道要输出的其他列中的多个值中的哪一个,如果您不关心,那么只需在distinct列上编写一个group by,其中包含Min()或Max()其他的..
编辑:我同意其他人的评论,只要你在同一个表中有多个依赖列(例如,Address1,Address2,City,State)这种方法会给你混合(因此不一致)的结果。如果表中的每个列属性是独立的(如果地址都在地址表中,并且此表中只有AddressId)那么它不是一个重要的问题...至少导致从连接到地址表的所有列将为同一地址生成日期,但您仍然可以随机选择一组多个地址...答案 1 :(得分:1)
如果您有一组混合字段,其中一些是您想要显示的字段而另一些是您想要显示的字段,则需要聚合查询而不是DISTINCT。 DISTINCT仅用于返回相同字段集的单个副本。这样的事情可能有用:
SELECT name,
GROUP_CONCAT(DISTINCT address) AS addresses,
GROUP_CONCAT(DISTINCT city) AS cities
FROM the_table
GROUP BY name;
以上每个名称都会有一行。 addresses
包含逗号分隔的字符串,该字符串包含该名称的所有地址一次。 cities
对所有城市都做同样的事情。
但是,我没有看到此查询的结果如何有用。无法确定哪个地址属于哪个城市。
通常情况下,如果您尝试创建一个将以演示文稿所需的格式输出行的查询,那么最好不要接受多行,然后在应用程序层中处理查询结果。
答案 2 :(得分: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
答案 3 :(得分:0)
你可以做
SELECT DISTINCT Name, Address, Max (Address1), Max (City)
FROM table
击> <击> 撞击>
使用下面的@JBrooks答案。他有更好的答案。
答案 4 :(得分:0)
我认为你不能这样做因为它没有用。
name | address | city | etc...
abc | 123 | def | ...
abc | 123 | hij | ...
如果你要包括城市,但没有把它作为不同条款的一部分,除非你做了像Max(城市)这样的事情,否则城市的价值将是不可预测的。
答案 5 :(得分: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