SQL Select - Union 结合 Join 查询导致错误

Posted

技术标签:

【中文标题】SQL Select - Union 结合 Join 查询导致错误【英文标题】:SQL Select - Union combined with Join query results an Error 【发布时间】:2020-07-06 11:09:46 【问题描述】:

我是一名学习 SQL 的业余爱好者,需要从三个表中获取记录,其中两个表的列结构和名称相同 (services, services_log),其中使用了 UNION 和一个表 ( visit) 可以JOIN使用相同列名的前两个表。

select vi.desc, serv.* from services serv
inner join visit vi
on serv.service_id = vi.visit_service_code
where serv.id = '777777'
union all 
select vi.desc, servlog.* from services_log serv.servlog
inner join visit vi
on servlog.service_id = vi.visit_service_code
where servlog.id = '777777'

上面的查询可以毫无问题地获取所需的记录,但我想尝试更简洁的方法并在下面执行。

select vi.desc, serv.* from (select * from services union all select * from services_log) as serv
inner join visit vi
on serv.service_id = vi.visit_service_code
where serv.id = '777777'

但是,这会显示错误。

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

上面第二个查询的语法不正确吗?是否有一个更简洁的查询我可以尝试获得结果而不是第一个查询?

谢谢。

【问题讨论】:

where 子句中有两个单引号。 纠正了先生,谢谢 【参考方案1】:

您的语法错误是from 子句中的as。 Oracle 不支持将as 用于表别名。

所以这是允许的:

from (select * from services union all
      select * from services_log
     ) serv

但不是:

from (select * from services union all
      select * from services_log
     ) as serv

即使这解决了直接的语法问题,您仍然需要保证两个表中的列是相同的并且以相同的顺序定义才能正常工作。

【讨论】:

知道了,先生,请同时使用 Oracle 和 mysql,这会造成混乱,谢谢。 另一个问题,当我的意思是更清晰的查询时,我想要更少的行没有重复的内容,但我猜第一个在性能方面仍然更好? @DilhanNakandala 。 . .第一个可能有更好的性能。更容易优化。

以上是关于SQL Select - Union 结合 Join 查询导致错误的主要内容,如果未能解决你的问题,请参考以下文章

sql注入绕过union select过滤

SQL UNION 和 UNION ALL 操作符SQL SELECT INTO 语句SQL CREATE DATABASE 语句

第八十章 SQL命令 UNION

sql注入绕过union select过滤

SQL基本操作——UNION

sql UNION SELECT