2009-11-23 60 views
0

我需要連接2個類似查詢的結果。出於某種原因,必須將原始查詢分成兩部分,兩部分都用相應的order by子句。應該是這樣的(這是原始查詢的過於簡單化)PL SQL連接2結果集

Query1: Select name, age from person where age=10 
Resultset1: 
Person1, 10 
Person3, 10 

Query2: Select name, age from person where age=20 
Resultset1: 
Person2, 20 
Person6, 20 

The expected result: 
Person1, 10 
Person3, 10 
Person2, 20 
Person6, 20 

我不能簡單地使用查詢1 UNION QUERY2。

下面的2個原裝querys: (#1)

select cp.CP_ID, cpi.CI_DESCRIPCION, cp.CP_CODIGOJERARQUIZADO, cp.CP_ESGASTO as gasto, cp.CP_CONCEPTOPADRE, LEVEL 
from TGCCP_ConceptoPagoIng cp 
left join tgcci_ConceptoPagoIngIdioma cpi on cpi.CI_IDCONCEPTOPAGOING = cp.CP_ID and cpi.CI_IDIDIOMA = 1 
start with ((CP_CONCEPTOPADRE is null) and (**cp.CP_ESGASTO = 1**)) 
connect by prior cp.CP_ID = cp.CP_CONCEPTOPADRE 
order siblings by CP_CODIGOJERARQUIZADO 

(#2)

select cp.CP_ID, cpi.CI_DESCRIPCION, cp.CP_CODIGOJERARQUIZADO, cp.CP_ESGASTO as gasto, cp.CP_CONCEPTOPADRE, LEVEL 
from TGCCP_ConceptoPagoIng cp 
left join tgcci_ConceptoPagoIngIdioma cpi on cpi.CI_IDCONCEPTOPAGOING = cp.CP_ID and cpi.CI_IDIDIOMA = 1 
start with ((CP_CONCEPTOPADRE is null) and (**cp.CP_ESGASTO = 2**)) 
connect by prior cp.CP_ID = cp.CP_CONCEPTOPADRE 
order siblings by CP_CODIGOJERARQUIZADO 
+0

不知道你想要什麼。你有兩個結果集......作爲遊標? PL/SQL的表?還有別的嗎?你想要一個遊標?一個PL/SQL表?還有別的嗎? –

+0

我有兩個查詢,但需要將它們合併爲1,所以我不必在應用程序的一端做額外的處理。1個查詢,1個結果集而不是2個 – john

+0

因此,您想要的是將這兩個查詢組合到一個單一的結果集中,而不是單個查詢中,這聽起來像? 簡單地組合結果集並不會節省很多時間(如果有的話)。 – moleboy

回答

0

OK,好,我不完全確定爲什麼你需要它這樣,但是如果Oracle不允許你創建一個UNION,或者當你這樣做的時候搞亂了順序,我會嘗試創建一個管道化的表函數。 An example here

基本上,你創建一個運行兩個查詢,第一個,那麼其他的程序,將每個結果到返回的數據集。

1

我想你想一個

select * from (first query) 
UNION ALL 
select * from (second query) 

first querysecond query是從上面的查詢,所以你把它們變成子查詢,從而保持by子句的順序。

0

它看起來你正在尋找一個MULTISET UNION。哪些只能從版本10開始使用。

Regards, Rob。

0

你可以結合你的查詢作爲子查詢,並通過在外部查詢做一個訂單:

select * from (
<query 1 with its order by> 
UNION ALL 
<query 2 with its order by> 
) 
order by column1, column2; 

或者,你可以實現在PL/SQL中的排序合併相當於用兩個光標加入,但這是不必要的複雜。

0

該解決方案完美的作品:

SELECT * FROM(第一查詢) UNION ALL SELECT * FROM(第二查詢)

我明白,花時間來回答大家。 關於。

+0

點擊「接受答案」按鈕怎麼辦? –

0

對於示例:

選擇名稱,從人的時代,年齡(10,20) 或 選擇名稱,從人,其中年齡= 10或年齡= 20

但是我的年齡米猜猜這不是你需要:)