在ORACLE版本切换时碰到一个奇怪的问题,一条原本正确的SQL语句出现错误

eastphoenix 2003-03-19 06:29:06
两个表
表1:Table1,包含一个操作人ID字段:OperatorID;
表2:Table2,放着操作人ID和名字:PersonID和PersonName
现在要关联两个表,读出Table1的所有字段,附加操作人的名字,为了使原操作人被删除时表1中的记录可以读出,故SQL语句写为:
select Table1.*,
(select PersonName from Table2 where Table2.PersonID = Table1.OperatorID)
from Table1;
此句在SQLServer上执行正常,在ORACLE8.1上也可以执行,现放在ORACLE8.0上则出错ORA-00936:缺少表达式,是我的ORACLE配的不对吗?请各位指教。
...全文
21 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
eastphoenix 2003-03-25
  • 打赏
  • 举报
回复
楼上方法有冗余,加个Distinct搞定,给分。
eastphoenix 2003-03-24
  • 打赏
  • 举报
回复
不对,Table1中有两个字段(OperatorID1和OperatorID2),而且如果这两个字段在Table2中都关联不到PersonName,则此条记录读不出。
snowy_howe 2003-03-24
  • 打赏
  • 举报
回复
如果table2中的PersonID已经使用, 就不应该能被删除。
可以通过外键约束来限制。
你的要求可以用:
select t1.* ,t2.personName as PersonName1 ,t3.PersonName as PersonName2
from table1 t1 ,table2 t2,table2 t3
where t1.OperatorID1 = t2.PersonID(+) and t1.OperatorID2= t3.PersonID(+);
来实现
eastphoenix 2003-03-21
  • 打赏
  • 举报
回复
现在Table1中有两个字段(OperatorID1和OperatorID2)要关联Table2的PersonName,而且OperatorID2有可能为空,如果Table2中没有相关的ID,则Table1中的记录也应该被读出,这该怎么写?不用union
写出来我将帖子加到100分。
数划云1 2003-03-21
  • 打赏
  • 举报
回复
不好意思,刚才写的有笔误。
select t1.* ,t2.personName as PersonName1 ,t3.PersonName as PersonName2
from table1 t1 ,table2 t2,table2 t3
where t1.OperatorID1 = t2.PersonID and t1.OperatorID1 = t3.PersonID(+)
数划云1 2003-03-21
  • 打赏
  • 举报
回复
select t1.* ,t2.personName as PersonName1 ,t3.PersonName as PersonName2
from table1 t1 ,table2 t2,table2 t3
where t1.OperatorID1 = t2.PersonID and t1.OperatorID1 = t2.PersonID(+)

这下应该可以了吧。
Intelement 2003-03-20
  • 打赏
  • 举报
回复
不好意思,中间那块去掉(+)
Intelement 2003-03-20
  • 打赏
  • 举报
回复
不是标准SQL语法
正面的是ORACLE独家SQL语法
ORACLE:
SELECT TABLE1.*,TABLE2.PersonName
FROM TABLE1, TABLE2
WHERE TABLE1.OperatorID=TABLE2.PersonID(+)

MS SQL SERVER ,ACCESS
SELECT TABLE1.*,TABLE2.PersonName
FROM TABLE1 LEFT OUTER JOIN TABLE2 ON TABLE1.OperatorID=TABLE2.PersonID(+)
(注,ACCESS要使用关健字OUTER,而在MS SQL SERVER中则可以省略)

别,MS SQL SERVER也有自己的外联接语法
*=左联接,相当于LEFT OUTER JOIN
=*右联接,相当于RIGHT OUTER JOIN
SELECT TABLE1.*,TABLE2.PersonName
FROM TABLE1, TABLE2
WHERE TABLE1.OperatorID*=TABLE2.PersonID

你自己可以分别试一试
upc_chenli 2003-03-20
  • 打赏
  • 举报
回复
呵呵。。oracle下就是这样写哦,到了 sql server中又有另外的写法。
eastphoenix 2003-03-20
  • 打赏
  • 举报
回复
楼上那个加号用的真帅,顺便问一句,这是标准SQL吗?
Intelement 2003-03-19
  • 打赏
  • 举报
回复
SELECT TABLE1.*,TABLE2.PersonName
FROM TABLE1, TABLE2
WHERE TABLE1.PersonID=TABLE2.PersonID(+)
eastphoenix 2003-03-19
  • 打赏
  • 举报
回复
刚才有个字段不让放在where子句中,否则也出现ORA-00936:缺少表达式,怎么回事?什么情况下会出现这种情况呢?
eastphoenix 2003-03-19
  • 打赏
  • 举报
回复
确实出错,请各位帮忙
beckhambobo 2003-03-19
  • 打赏
  • 举报
回复
若是PersonID唯一应该没有错

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧