我有两个关系视图。
第一个观点:
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
是我创建的关系视图?
答案 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将无法附加行来创建一组行,因为某些行中有三个值,而其他行则有两个。