多列中的不同值

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 要求的。

以上是关于多列中的不同值的主要内容,如果未能解决你的问题,请参考以下文章

MySQL计算多列上的不同值

oracle 多列中存在的 COUNT 个不同值

将唯一值(在多列中)传播到不同的列并粘贴聚合值

Oracle 更新的多列和不同的连接条件

认识SQLServer索引以及单列索引和多列索引的不同

在不同颜色的同一图中绘制不同网格中的多列