4

我正在尝试为表中的多个列获取不同的值。

例如,如果我的表有 COL1、COL2、COL3 作为列,并且我正在运行类似的查询

SELECT DISTINCT COL1, COL2, COL3 FROM TABLEx

但会发生什么取决于其中一列中的数据,我在另外两列中得到重复值。如果 COL1 有 40 个唯一值,COL2 只有 10 个唯一值,COL3 有 5 个唯一值。我得到 40 行数据,其中 COL1 是唯一的,COL2/COL3 具有重复值。如何获取每列的 DISTINCT 值并将重复值替换为空值。我这样做只是为了在网页中为我的下拉列表获取不同的值。我总是可以对每个字段执行单独的查询,但我认为它不是很有效。我如何处理这个问题有什么帮助吗?

4

5 回答 5

4

我总是可以对每个字段执行单独的查询

是的!做这个!

但我认为它不是很有效。

应该没问题吧。您可以通过向每列添加单独的索引来提高性能。如果您仍然担心它会变慢,请测量它以确定。如果事实证明这确实是一个问题,那么您可能需要考虑使用缓存。

于 2012-08-13T19:32:18.803 回答
0

不完全确定这是您正在寻找的内容,而且它只会比单独的查询更高效:

select distinct a, null, null
  from MyTable
 union
select distinct null, b, null
  from MyTable
 union 
select distinct null, null, c
  from MyTable

注意:这当然不是编写 sql 查询的正确方法,但确实为该问题提供了可能的解决方案。

于 2012-08-13T19:39:42.460 回答
0

我使用了单个查询,但仅在获得结果集后才使用 Set 来存储唯一值。这样我就不会用多个查询加载数据库。

于 2012-08-17T14:27:49.717 回答
0

如果您的 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 组合它们。

于 2012-08-13T19:40:14.443 回答
-1
SELECT DISTINCT c1, c2 FROM t

也可以使用

SELECT c1, c2 FROM t GROUP BY c1, c2

它对我有用。

于 2013-07-04T13:21:41.110 回答