多列中的不同值
Posted
技术标签:
【中文标题】多列中的不同值【英文标题】:Distinct values in multiple columns 【发布时间】:2012-08-13 19:29:08 【问题描述】:我正在尝试为表中的多个列获取不同的值。
例如,如果我的表有 COL1、COL2、COL3 作为列,并且我正在运行类似的查询
SELECT DISTINCT COL1, COL2, COL3 FROM TABLEx
但是会发生什么取决于其中一列中的数据,我在另外两列中得到重复值。如果 COL1 有 40 个唯一值,COL2 只有 10 个唯一值,COL3 有 5 个唯一值。我得到 40 行数据,其中 COL1 是唯一的,COL2/COL3 具有重复值。如何获取每列的 DISTINCT 值并将重复值替换为空值。我这样做只是为了在网页中为我的下拉列表获取不同的值。我总是可以对每个字段执行单独的查询,但我认为它不是很有效。我如何处理这个问题有什么帮助吗?
【问题讨论】:
【参考方案1】:我总是可以对每个字段执行单独的查询
是的!这样做!
但我认为它不是很有效。
应该没问题。您可以通过向每列添加单独的索引来提高性能。如果您仍然担心它会变慢,请测量它以确定。如果事实证明这确实是一个问题,那么您可能需要考虑使用缓存。
【讨论】:
特别是问题有点像列可能是“不相关的”。要么,要么执行“分组”客户端。【参考方案2】:不完全确定这是您要查找的内容,而且它只会比单独的查询更高效:
select distinct a, null, null
from MyTable
union
select distinct null, b, null
from MyTable
union
select distinct null, null, c
from MyTable
注意:这当然不是编写 sql 查询的正确方式,但确实为问题提供了可能的解决方案。
【讨论】:
【参考方案3】:如果您的 Sybase 版本恰好包含 row_nubmer(),您可以使用 union all 执行此操作:
select seqnum, max(col1) as col1, max(col2) as col2, max(col3) as col3
from ((select row_number() over (order by col1) as seqnum
col1, NULL as col2, NULL as col3
from (select distinct col1
from t
) t
) union all
(select row_number() over (order by col2) as seqnum
NULL as col1, col2, NULL as col3
from (select distinct col2
from t
) t
) union all
(select row_number() over (order by col3) as seqnum
NULL as col1, NULL as col2, col3
from (select distinct col1
from t
) t
)
) t
group by seqnum
order by seqnum
这会为每个值添加一个序列号,然后使用 group by 组合它们。
【讨论】:
OP 使用的是 Sybase ASE,据我所知,它不支持 ROW_NUMBER() 函数... 我猜一些基于 Sybase 的数据库可以——Sybase IQ 和 SQL Anywhere。我可以说这取决于所使用的版本。 我不会说“取决于所使用的版本”——Sybase ASE 是与 Sybase IQ 和 SQLAnywhere 完全不同的产品。【参考方案4】:我使用了单个查询,但仅在获得结果集后才使用 Set 来存储唯一值。这样我就不会使用多个查询加载数据库。
【讨论】:
【参考方案5】:SELECT DISTINCT c1, c2 FROM t
也可以用
SELECT c1, c2 FROM t GROUP BY c1, c2
它对我有用。
【讨论】:
这将返回 col1/col2 值的所有组合。这不是 OP 要求的。以上是关于多列中的不同值的主要内容,如果未能解决你的问题,请参考以下文章