日期:2014-05-17  浏览次数:20704 次

两个sql的不同之处?
SELECT e1.ename, e2.ename mgr_name
  FROM (SELECT ename, empno
           FROM emp) e2, emp e1
 WHERE e2.empno = e1.mgr
 ORDER BY e1.ename;

SELECT e1.ename,
       (SELECT ename mgr_name
           FROM emp
          WHERE empno = e1.mgr)
  FROM emp e1
 ORDER BY e1.ename;

初入门oracle,要求查询出emp表中的雇员名和其直属上司的名字,现在有个疑问:
第一个sql查出13条数据,就是说没有查出没有上司的那个人,而第二条语句查出14条,找出了那个没有上司的人,那么小弟想问的是这两条语句的不同点是什么,为啥会出现这样的情况?谢谢各位的简单指点。。。
SQL Oracle

------解决方案--------------------
SELECT e1.ename, e2.ename mgr_name
  FROM (SELECT ename, empno
           FROM emp) e2, emp e1
 WHERE e2.empno = e1.mgr
 ORDER BY e1.ename;


--这个语句是把SELECT ename, empno FROM emp作为一个查询结果表和emp进行自然连接,连接条件是找e2.empno = e1.mgr,如果有一个EMPNO没有MGR的话,这个关联条件不满足,所以不能查询出没有上司的那个人

SELECT e1.ename,
       (SELECT ename mgr_name
           FROM emp
          WHERE empno = e1.mgr)
  FROM emp e1
 ORDER BY e1.ename;

--这个语句是扫描EMP中的每一行,对于每一行都去EMP表里面找到满足条件(SELECT ename mgr_name
           FROM emp
          WHERE empno = e1.mgr)的ENAME,如果找不到,返回的是NULL,所以第二条语句查出14条,找出了那个没有上司的人

两个语句的不同点在于两表关联查询和子查询的区别!