使用子查询时“SQL 命令未正确结束”
Posted
技术标签:
【中文标题】使用子查询时“SQL 命令未正确结束”【英文标题】:"SQL command not properly ended" when using subquery 【发布时间】:2015-04-25 14:22:11 【问题描述】:我有以下查询工作:
select
a.column_value as artigo
from
encomenda e, table(e.artigos) a
where
e.id = 2;
此查询返回以下输出(一行menu_t
类型和另一行bebida_menu_t
类型)。请注意,这不是简单的文本,而是我自己定义的类型的对象,因为这是一个对象关系数据库。
从该结果中,我只想提取 menu_t
行。所以,我尝试了以下查询:
select *
from (select
a.column_value as artigo
from
encomenda e, table(e.artigos) a
where e.id = 2) as subquery
where
subquery.artigo is of (menu_t);
这给了我错误
00000 - “SQL 命令未正确结束”
我不明白为什么。
更新:
似乎问题出在as
关键字上。所以,应该是:
select *
from (select
a.column_value as artigo
from
encomenda e, table(e.artigos) a
where e.id = 2) subquery --removed the 'as' here
where
value(subquery.artigo) is of (menu_t); --added value() because they were inconsistent types
但是,现在我收到错误消息,指出 subquery.artigo
是无效标识符。
00000 - “%s:无效标识符”
【问题讨论】:
事实上AS
在mysql中使用但在ORACLE中没有;为列名artigo
也删除它
【参考方案1】:
你需要改变:
where subquery.artigo is of (menu_t);
到
where subquery.artigo LIKE '%MENU_T';
【讨论】:
我仍然遇到同样的错误。为什么is of
无论如何都不应该是有效的?
你认为is of
做了什么,你知道什么?
这是一个对象关系型数据库,menu_t
和bebida_menu_t
是我自己定义的类型。我猜is of
会检查它们是否属于那种类型,例如类似于 Java 的instanceof
。
问题是子查询别名上的 as
关键字。但我仍然有一个错误。请检查我的原始帖子。【参考方案2】:
所以,要解决第一个问题,正如我在更新中所说,在 Oracle 中,我们不应该在别名上使用 as
关键字。因此,查询变为:
select *
from (select
a.column_value artigo
from
encomenda e, table(e.artigos) a
where e.id = 2) subquery
where
subquery.artigo is of (menu_t);
但在此之后,我又遇到了另一个错误,如更新中所述。发生的事情是我尝试在REF
中使用is of
,它警告我这是一个无效的标识符,但我花了一些时间和许多尝试来实现正确的查询。所以,我需要在art.column_value
列上使用deref()
。
毕竟,我什至不需要嵌套子查询。最后的查询是:
select value(e).id id, art.column_value artigo
from encomenda e, table(e.artigos) art
where e.id = 2 and
deref(art.column_value) is of (menu_t);
【讨论】:
以上是关于使用子查询时“SQL 命令未正确结束”的主要内容,如果未能解决你的问题,请参考以下文章
来自 UPDATE 查询的“SQL 命令未正确结束”错误 [重复]