2014-02-14 82 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;