2012-11-14 53 views
0

我正在尋找一個SQL查詢的一點幫助。 (我正在使用Oracle。)SQL Downselect根據字段重複查詢結果

我有一個查詢是2個不同的select語句的聯合。結果數據如下所示:

Col1  Col2  Col3 
XXX  ValA  Val1 
XXX  ValB  Val2 
YYY  ValA  Val1 
YYY  ValA  Val2 

在此設置中,Col1 = XXX是默認值,Col1 = YYY是實際值。實際值(YYY)應該對默認值進行預測。實際值是通過2列和3

我期待downselect這些結果爲以下定義:

Col1  Col2  Col3 
XXX  ValB  Val2 
YYY  ValA  Val1 
YYY  ValA  Val2 

注意,第一行已移除...那是因爲有真實的值(第3行中的YYY)對默認值(XXX)進行了精確定位。

有關如何解決這個問題的任何想法?

+0

什麼使得YYY成爲「真正的價值」而XXX成爲「默認值」並不十分清楚。如果沒有一些方法來區分哪些是首選的,那麼您將很難完成這一任務。 – Allan

+0

YYY只是通過另一個查詢知道的真名的佔位符。 XXX是默認值的設置字符串值。我已經解決了這個問題。謝謝。 – typhoid

+0

每個Col2,Col3對只有一個YYY值,或者可能有多個? – fthiella

回答

0

我想你可以使用一個技巧是這樣的:

select 
    case when 
    max(case when col1<>'XXX' then col1 end) is null then 'XXX' else 
    max(case when col1<>'XXX' then col1 end) end as col1, 
    col2, 
    col3 
from 
    your_table 
group by col2, col3 

我通過變換col3的默認值設置爲null,然後我組。 null和值之間的最大值是您正在查找的值。這適用於您的示例數據,但它可能不是您正在尋找的內容,這取決於您的真實數據。

2

您想過濾掉col2和col3出現在XXX上的所有行,並使用另一個值。

您可以通過使用解析函數在子查詢做適當的計數實現這個過濾器:

select col1, col2, col3 
from (select t.*, 
      count(*) over (partition by col2, col3) as numcombos, 
      sum(case when col1 = 'XXX' then 1 else 0 end) over (partition by col2, col3) as numxs 
     from t 
    ) t 
where numcombos = numxs or (col1 <> 'xxx') 
1

我的直覺是使用分析功能:

select distinct 
     first_value(col1) 
      over (partition by col2, col3 
       order by case col1 
       when 'XXX' then 1 
       else 0 end asc) as col1, 
     col2, 
     col3 
from table1 

但是,如果表大和索引,它可能會更好地解決這個全外連接(這是可能的,因爲只有兩個可能的值):

select coalesce(rl.col1, dflt.col1) as col1, 
     coalesce(rl.col2, dflt.col2) as col2, 
     coalesce(rl.col3, dflt.col3) as col3 
from (select * from table1 where col1 = 'XXX') dflt 
full outer join (select * from table1 where col1 <> 'XXX') rl 
on dflt.col2 = rl.col2 and dflt.col3 = rl.col3; 

[Solution in SQLFiddle]