两个子查询单独工作正常但“SQL 命令未正确结束”当加入时除了 [解释说我是五岁]

Posted

技术标签:

【中文标题】两个子查询单独工作正常但“SQL 命令未正确结束”当加入时除了 [解释说我是五岁]【英文标题】:Two subqueries work fine individually but "SQL command not properly ended" when join by except [Explain like I'm five] 【发布时间】:2020-06-11 09:14:41 【问题描述】:

我看了很多类似的帖子,但我仍然找不到类似的案例,或者我太初学者无法理解问题中的命令。

我写的命令返回ORA-00933: SQL command not properly ended:

(select product.productid, productname, productprice 
from product, soldvia 
where product.productid = soldvia.productid 
group by product.productid, product.productname, product.productprice 
having sum(soldvia.noofitems) > 3 )

except 

(select product.productid, productname, productprice 
from product, soldvia 
where product.productid = soldvia.productid 
group by product.productid, product.productname, product.productprice 
having count(soldvia.tid) > 1);

当我运行单个选择命令时,它们运行良好并返回预期结果。

编辑:我正在使用此命令学习EXCEPT,因此,我必须使用该命令来完成任务。 任务是:

检索在所有销售交易中售出超过三件商品但未在超过一次销售交易中售出的每件商品的商品 ID、商品名称和商品价格

【问题讨论】:

【参考方案1】:

except 在 Oracle 中不是一个东西;等效关键字是minus:如果您更改关键字,您的查询应该会正常工作。

另一方面,两个查询完全相同,因此您可以合并 having 子句:

select p.productid, p.productname, p.productprice 
from product p
inner join soldvia s on p.productid = s.productid 
group by p.productid, p.productname, p.productprice 
having sum(s.noofitems) > 3 and count(s.tid) <= 1

注意事项:

总是使用标准的显式连接(使用 on 关键字)而不是老式的隐式连接(在 from 子句中使用逗号):这种旧语法不应在新代码中使用

表别名使查询更易于编写和阅读

在多表查询中,总是用它们所属的表来限定所有列名,这样查询是明确的并且更容易理解

【讨论】:

感谢您的快速回复。但是,我现在正在学习EXCEPT,所以我必须使用该子句。 @soobster:您需要在 Oracle 中使用 minus。我更新了我的答案来解释这一点。 哇,谢谢。奇怪的是,我的班级教授 sqlplus 和 except,却没有提及任何关于 minus 的内容。非常感谢!!!

以上是关于两个子查询单独工作正常但“SQL 命令未正确结束”当加入时除了 [解释说我是五岁]的主要内容,如果未能解决你的问题,请参考以下文章

SQL 命令未正确结束尝试使用查询连接 3 个表

mybatis 中用insert into select ..... 报错命令未正确结束,但把这句sql放到plsql中执行正常

mybatis 中用insert into select ..... 报错命令未正确结束,但把这句sql放到plsql中执行正常

来自 UPDATE 查询的“SQL 命令未正确结束”错误 [重复]

ORACLE 两个order by的SQL使用 UNION 或者 UNION ALL 报错 ORA-00933:sql命令未正确结束

ORA-00933: SQL 命令未正确结束异常