请问这是ORACLE的Bug吗

詩和遠方 2015-06-17 06:13:38
先准备数据:
CREATE TABLE Table_A(EID NUMBER PRIMARY KEY);
/
CREATE TABLE Table_B(EID NUMBER PRIMARY KEY,EMail VARCHAR2(300));
/

INSERT INTO Table_A(EID)
SELECT 1 FROM Dual UNION ALL
SELECT 2 FROM Dual UNION ALL
SELECT 3 FROM Dual UNION ALL
SELECT 4 FROM Dual;
/
INSERT INTO Table_B(EID,Email)
SELECT 3,'123@qq.com' FROM Dual UNION ALL
SELECT 4,'234@qq.com' FROM Dual;
/
COMMIT;

再看查询:
--有返回记录
SELECT a.EID
FROM Table_A a
LEFT JOIN Table_B b ON a.EID = b.EID;

-- 无返回记录???
SELECT a.EID
FROM Table_A a
LEFT JOIN (SELECT EID,EMail FROM Table_B WHERE EID IN (3,4)) b ON a.EID = b.EID;

-- 加一列,又返回记录了!!!
SELECT a.EID,b.Email
FROM Table_A a
LEFT JOIN (SELECT EID,EMail FROM Table_B WHERE EID IN (3,4)) b ON a.EID = b.EID;

-- 用COUNT(*)包一层,结果居然是0
SELECT COUNT(*)
FROM (SELECT a.EID,b.Email
FROM Table_A a
LEFT JOIN (SELECT EID,EMail FROM Table_B WHERE EID IN (3,4)) b ON a.EID = b.EID);


奇怪的是,上面建表时,如果不加主键,则上面第2个查询是有记录的,最后一个也不是返回0.

附ORACLE版本:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
...全文
167 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
詩和遠方 2015-06-18
  • 打赏
  • 举报
回复
真搞不懂,难道底层存储相关,比如表空间或索引什么的
小灰狼W 2015-06-18
  • 打赏
  • 举报
回复
看看执行计划 中间两个语句的执行计划应该是不一样的
碧水幽幽泉 2015-06-17
  • 打赏
  • 举报
回复
我的数据库也是Oracle11g,使用楼主的语句查询,都是有数据的。

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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