2015-04-06 72 views
0

好吧...所以我想要做的是有一個查詢(我不能使用PL/SQL作爲查詢由不能處理PL/SQL的應用程序使用)只是查詢一個表,如果不滿足特定條件,它實際上會在返回的結果中創建一個具有該條件的記錄(實際上並不是在表中創建記錄) 。Oracle SQL:如果不滿足條件在返回的結果中創建一條記錄

要這樣設置,設想只有一個表有以下的列:ID,TEST,並SPEC並且可以具有數據如下所示:

1234 LIMIT_TEST Total of limits 
4321 LIMIT_TEST Total of limits 
5678 LIMIT_TEST Etha 
8765 LIMIT_TEST Metha 

的SPEC列由一個情況下產生的, when,then語句將表達式從SPECIFICATION列中提取出來。

所以你會看到居然有3個LIMIT_TESTs:

  • 限制
  • ETHA總
  • 梅塔

然而,對於ID 1234,只有「總限制」。我需要有查詢返回的是一樣的東西:

1234 LIMIT_TEST Total of limits 
1234 LIMIT_TEST null    Etha 
1234 LIMIT_TEST null    Metha 

(想象一下,在case語句中添加一列放什麼的零點是)。

任何想法表示讚賞。

回答

0

你可以成爲你的主要查詢和另一個其中包括在其SELECT第一個靜態NULL,並在其WHERE條款使用NOT EXISTS確定沒有EthaMetha之間的UNION

0

這將做到這一點...

select 
    c.id, c.test, d.spec, case when d.spec is null then c.spec else null end as missing_spec 
from 
    (select a.id, a.test, b.spec from TABLE_NAME a, (select distinct spec from TABLE_NAME) b) c, 
    TABLE_NAME d 
where c.id = d.id (+) and c.test = d.test (+) and c.spec = d.spec (+) 
order by c.id, c.spec; 

假設:有隻將永遠是表中的一個記錄ID,測試和規範的每個獨特組合。

1)笛卡爾連接源表與一個清晰的spec值列表。這將提供一個基礎結果列表,其中包含所有可能的ID,測試和規格值的每個唯一組合的記錄。
2)左外連接源表。這將允許您識別所有可能的唯一組合中哪一個實際存在於源表中。
3)爲最終結果列的select子句添加一個case,當找到組合時顯示null,如果缺少spec value,則顯示spec。

如果源表有可能爲id,test和spec的單個組合創建多個記錄,那麼您應該在第4行的a.id之前添加distinct(如Ponder Stibbons所述)。

+0

用解釋編輯答案。 – gsamaras

+0

發明。但是,如果同一個id有兩行,它會返回相乘的行,我猜想在'a.id'之前添加'distinct'會有幫助(不確定)。 請正確查詢並用簡短的單詞解釋,這是一個有趣的答案。 –

0
select id, test, decode(spec, ms, spec) spec, nullif(ms, spec) missing 
    from (select id, test, spec, ms, 
     row_number() over (partition by id, ms order by decode(spec, ms, 1)) rn 
     from t cross join (select distinct spec ms from t) dt) 
    where rn = 1 

SQLFiddle(我在這裏添加一行id=1234, spec ='Etha'其中存在這兩個標準的一個ID,以檢查情況 )。表名是T,不具有創造性。


說明:

  • 選擇distinct spec - 明顯的階梯
  • 交叉連接與我們的表不同規格 - 可能必須以某種方式在任何解決方案來完成(工會,存在等)
  • 枚舉行取決於規格是否相等,則此行具有優先級 - 這是通過row_number()
  • 取得的行只有rn = 1,休息是介紹的問題(功能decodenullif)。