ORACLE选择Distinct返回多列和哪里

时间:2014-02-14 11:52:40

标签: sql oracle select

我有一张看起来像这样的表:

NAME    Col1     Col2    Col3
Tim     1        2       3
Tim     1        1       2
Tim     2        1       2
Dan     1        2       3
Dan     2        2       1
Dan     2        1       3

我试图制作一个SELECT命令,结果如下:

NAME    Col1     Col2    Col3
Tim     2        1       2
Dan     2        2       1

所以我想要不同的名字,但选择所有四列,其中Col1 = 2。 我在这里使用解决方案来获得独特的部分: SQL/mysql - Select distinct/UNIQUE but return all columns?

但是当我将select Col1 = '2'添加到select语句的WHERE部分时,并不会返回Col1为2的所有名称,因为我认为它首先查看不同的名称,而不是1,因此获取该结果。

希望我有道理,有人可以提供帮助。很难解释并想出一个好头衔。谢谢!

2 个答案:

答案 0 :(得分:1)

如果只选择那两列(name和col1)就足够了,你可以使用:

select 
    distinct x.name, x.col1
  from table_name x
  where x.col1 = 2;

select 
    x.name, x.col1
  from table_name x
  where x.col1 = 2
  group by (x.name, x.col1);  

如果你需要所有的值,但是你不介意哪一个符合你的标准的多个记录(例如Dan 2 2 1或Dan 2 1 3),你可以使用它(它将记录这些记录中的第一个按标准订购):

select xx.name, xx.col1, xx.col2, xx.col3
  from (select 
      x.name, x.col1, x.col2, x.col3, dense_rank() over (partition by x.name order by x.name, x.col1, x.col2, x.col3) rnk
    from table_name x
    where x.col1 = 2) xx
  where xx.rnk = 1;

答案 1 :(得分:0)

据我所知,这个查询可以解决你的问题:

select distinct a.* from temp_ids a join

(select name, max(col1 || ' ' || col2  || ' ' || col3) id
from temp_ids
where col1 = 2
group by name
) b

on (a.name = b.name and (col1 || ' ' || col2  || ' ' || col3) = b.id)
;

原因,最好使用唯一记录ID代替连接,但生成id是可能的。确保id的函数为每个列组合返回唯一值(在这种情况下使用(col1 ||''|| col2 ||''|| col3))