错误:ORA-01789:查询块的结果列数不正确

Posted

技术标签:

【中文标题】错误:ORA-01789:查询块的结果列数不正确【英文标题】:Error: ORA-01789: query block has incorrect number of result columns 【发布时间】: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

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

【问题讨论】:

【参考方案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 将无法附加这些行来创建一组行,因为有些行中包含三个值,而另一些行中包含两个值。

【讨论】:

以上是关于错误:ORA-01789:查询块的结果列数不正确的主要内容,如果未能解决你的问题,请参考以下文章

组合和连接两个不同编号的表。列和相同的列名

Oracle随录

oracle union 和 union all

ORA-01789: query block has incorrect number of result columns

Union All 的列数不匹配

列数不匹配