2014-02-14 58 views
1

我有一个表,看起来像这样:ORACLE SELECT DISTINCT返回许多列,其中

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?

但是当我添加Col1 = '2'到选择语句的WHERE部分是不会返回所有名称,其中Col1是2,因为我认为它看起来不同的第一个不是1因此需要该结果。

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

+4

您有两列col1 = 2和姓名='丹',但你没有指定你想如何选择显示哪一个... Dan 2 2 1 Dan 2 1 3 – het2cz

+0

只要它告诉我有一个Dan与Col1 = 2而不是获取col1 = 1的那个,然后不显示Dan。 – Safinn

+0

然后不要选择所有的行,只是'select name,col1 from table1 where col1 = 2' –

回答

1

据我了解此查询应该能解决你的问题:

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))

+1

是的,我使用了一些非常相似但更简单的东西。 'SELECT name,MAX(col1),MAX(col2),MAX(col2)FROM table WHERE col2 ='2'GROUP BY name ORDER by name' – Safinn

+0

是的,唯一的行标识符只有在需要选择值来自同一行 – AppLend

0

如果只选择那些2列(名称和COL1)是sufficent你可以使用:

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;