【问题标题】:Error: ORA-01789: query block has incorrect number of result columns错误:ORA-01789:查询块的结果列数不正确
【发布时间】:2012-11-26 06:49:48
【问题描述】:

我有两个关系视图。

第一个视图:

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#;

我用 从 VIEW1 中选择 * 联合所有 从 VIEW2 中选择 *

我得到了错误 ORA-01789。

我想要实现的是

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

我创建的视图是否被视为关系视图?

【问题讨论】:

    标签: sqlplus


    【解决方案1】:

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

    【讨论】:

      【解决方案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。)

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

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

      原因是UNION ALL 只是将行附加在一起,而不是合并它们。如果VIEW1 仍然有它的ORIGIN 列,Oracle 将无法附加这些行来创建一组行,因为有些行中包含三个值,而另一些行中包含两个值。

      【讨论】:

        猜你喜欢
        • 2020-10-14
        • 1970-01-01
        • 1970-01-01
        • 2020-11-14
        • 1970-01-01
        • 2020-09-15
        • 2022-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多