错误:ORA-01789:查询块的结果列数不正确

时间:2012-11-26 06:49:48

标签: sqlplus

我有两个关系视图。

第一个观点:

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 VIEW2

我收到错误ORA-01789。

我想要实现的是

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

是我创建的关系视图?

2 个答案:

答案 0 :(得分:6)

两个视图必须具有相同的列数才能执行UNION ALL。查看Oracle参考:The UNION ALL, INTERSECT, MINUS Operators

答案 1 :(得分: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,如上所述。)

如果您从ORIGIN删除了VIEW1列,则可以运行SELECT * FROM VIEW1 UNION ALL SELECT * FROM VIEW2,但这会为您提供以下输出:

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

原因是UNION ALL只是将行附加在一起,它不会合并它们。如果VIEW1仍然有ORIGIN列,那么Oracle将无法附加行来创建一组行,因为某些行中有三个值,而其他行则有两个。