【发布时间】:2011-05-06 13:47:53
【问题描述】:
我有一个包含多列的表,但我只需要 2 个。
select id, department from tbl
如果我想使用distinct,我该怎么做?
这不起作用:
select id, distinct department from tbl
【问题讨论】:
-
您没有提供足够的信息来回答。您应该发布一些示例数据。
我有一个包含多列的表,但我只需要 2 个。
select id, department from tbl
如果我想使用distinct,我该怎么做?
这不起作用:
select id, distinct department from tbl
【问题讨论】:
使用以下方法获取不同的行:
select distinct id, department
from tbl
但是,如果某些部门有多个 ID,您不能简单地获得不同的部门 - 您需要弄清楚您想要多个 ID 中的哪一个(最大?最小?其他?)。
【讨论】:
SELECT * FROM Table c1
WHERE ID = (SELECT MIN(ID) FROM Table c2
WHERE c1.department = c2.department)
【讨论】:
DISTINCT 需要对所有列进行操作,原因与GROUP BY 需要包含所有列(没有对它们操作的聚合函数)相同的原因,那就是在您想要的情况下将 DISTINCT 应用于以下结果集
id department
----------------
1 one
2 one
3 one
4 two
那么即使SELECT id, DISTINCT department FROM table_name 被允许(并且它在某些数据库中;例如 mysql 可以按部门分组而不在 GROUP BY 中包含 id),那么您最终会遇到未定义的情况:
id department
----------------
? one
4 two
应该用什么来代替 ? - 1、2 或 3?
【讨论】:
小组会解决您的问题吗?
select id, department from tbl group by id
【讨论】:
问题的确切问题尚不清楚,但一种情况可能是您想要获取所有行,但特定列应仅包含唯一值,并且您不介意丢弃哪些行来实现此目的。
在 SQL Server 中,这可以通过以下方式实现:
SELECT id, department FROM tbl WHERE id IN (
SELECT MIN(id)
FROM tbl
GROUP BY department
)
其中id 对每一行都是唯一的,department 是应该不同的列,tbl 是表名。
如果您只想对非 NULL 值执行此检查(因此仍返回 department 的所有 NULL 值),可以将其调整为:
SELECT id, department FROM tbl WHERE department IS NULL OR id IN (
SELECT MIN(id)
FROM tbl
GROUP BY department
)
请注意,这将运行非常缓慢,因此仅适用于行数较少的表。
【讨论】: