6

我有两种关系观点。

第一种观点:

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

是我创建的考虑过的关系视图吗?

4

2 回答 2

11

两个视图必须具有相同数量的列才能执行 UNION ALL。查看 Oracle 参考资料:UNION ALL、INTERSECT、MINUS 运算符

于 2013-03-08T09:05:29.847 回答
3

我想你想要一个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 将无法附加这些行来创建一组行,因为有些行中会有三个值,而另一些行会有两个。

于 2013-10-17T20:34:39.027 回答