私には2つの関係的な見方があります。
最初のビュー:
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#;
2番目のビュー:
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 * FROMVIEW2を使用します
そして、エラーORA-01789が発生しました。
私が達成したいのは
T# | Origin | DESTINATION1 | DESTINATION2
------------------------------------------------------
1 abc efg hij
私が作成するものは、考慮されたリレーショナルビューですか?
UNION ALLを実行するには、両方のビューに同じ数の列が必要です。 Oracleリファレンスを見てください: NION ALL、INTERSECT、MINUS演算子
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
列がある場合、一部の行には3つの値があり、他の行には2つの値があるため、Oracleは行を追加して1セットの行を作成できません。