2012-11-26 30 views
1

我有兩個關係視圖。錯誤:ORA-01789:查詢塊的結果列數不正確

第一視點:

CREATE VIEW VIEW1 
AS 
SELECT T#, 
MAX(DECODE(LEG#,1,DEPARTURE)) ORIGIN, 
MAX(DECODE(LEG#,1,DESTINATION)) DESTINATION1 
FROM TRIPLEG 
WHERE T# IN 
(SELECT T# FROM TRIPLEG WHERE LEG# < 3 
AND T# IN 
(SELECT T# FROM TRIPLEG GROUP BY T# 
HAVING COUNT(T#) < 3) 
GROUP BY T#) 
GROUP BY T# 
ORDER BY T#; 

第二種觀點:

CREATE VIEW VIEW2 
AS 
SELECT T#, 
MAX(DECODE(LEG#,2,DESTINATION)) DESTINATION1 
FROM TRIPLEG 
WHERE T# IN 
(SELECT T# FROM TRIPLEG WHERE LEG# < 3 
AND T# IN 
(SELECT T# FROM TRIPLEG GROUP BY T# 
HAVING COUNT(T#) < 3) 
GROUP BY T#) 
GROUP BY T# 
ORDER BY T#; 

我用 SELECT * FROM VIEW1 UNION ALL SELECT * FROM視圖2

而且我得到了錯誤ORA- 01789。

我想實現的是

T# |  ORIGIN | DESTINATION1 | DESTINATION2 
------------------------------------------------------ 
1   abc   efg   hij 

是什麼,我認爲創建的關係視圖?

回答

2

我想你想要一個INNER JOIN而不是UNION ALL。有如下所示的幫助嗎?

SELECT v1.T#, v1.ORIGIN, v1.DESTINATION1, v2.DESTINATION2 
    FROM VIEW1 v1 
INNER JOIN VIEW2 v2 ON v1.T# = v2.T# 

(我假設你的觀點VIEW2有一個名爲DESTINATION2,不DESTINATION1因爲上面寫的一列。)

如果從VIEW1扔下ORIGIN列,然後你可以運行SELECT * FROM VIEW1 UNION ALL SELECT * FROM VIEW2,但是這會給你以下輸出:

T# | DESTINATION1 
--------------------- 
1  |  efg  
1  |  hij 

原因是,UNION ALL只是將行附加在一起,它不合並米如果VIEW1仍然有其ORIGIN列,則Oracle將無法追加行來創建一組行,因爲某些行將有三個值,其他行將有兩個值。