web-dev-qa-db-ja.com

エラー:ORA-01789:クエリブロックの結果列の数が正しくありません

私には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

私が作成するものは、考慮されたリレーショナルビューですか?

5
Rusydi Rusydii

UNION ALLを実行するには、両方のビューに同じ数の列が必要です。 Oracleリファレンスを見てください: NION ALL、INTERSECT、MINUS演算子

8
Carlos

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セットの行を作成できません。

3
Luke Woodward