select子查詢

wadekobe9發表於2011-05-19

典型的寫法
 select empno, ename, sal, dname, loc
   from emp, dept
  where emp.deptno = dept.deptno

子查詢的寫法(dname和loc這裡是分開寫的,他們不能寫到一個子查詢裡面)
 select empno,
        ename,
        sal,
        (select dname from dept where emp.deptno = dept.deptno) dname,
        (select loc from dept where emp.deptno = dept.deptno) loc
   from emp

這裡的emp和dept表都是最系統自帶的,沒有改動過

這裡注意dept表的結構,deptno和dname、loc都是一一對應的
SQL> select * from dept;
 
DEPTNO DNAME          LOC
------ -------------- -------------
    10 ACCOUNTING     NEW YORK
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON
 

-----------------------------------------------------------------------------------
進行如下改動
SQL> create table deptx as select * from dept;
SQL> insert into deptx values(10,'xxx','yyy');
SQL> select * from deptx;
 
DEPTNO DNAME          LOC
------ -------------- -------------
    10 ACCOUNTING     NEW YORK
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON
    10 xxx            yyy


再次執行如下SQL會報錯 ORA-01427:d單行子查詢返回多個行,原因在於這裡的deptno=10時,dname出現的是2個值了,
而在和emp做連線的時候,ename的deptno等於10時不知道是選哪個dname,也就是說還是做連線的deptno出了問題,
deptno 在一邊對應一個值,在另一邊對應2個值
  select deptno,
        ename,
        sal,
        (select dname from deptx where emp.deptno = deptx.deptno) dname,
        (select loc from deptx where emp.deptno = deptx.deptno) loc
   from emp

改寫如下
   select deptno,
        ename,
        sal,
        (select dname from deptx where emp.deptno = deptx.deptno and rownum<=1) dname,
        (select loc from deptx where emp.deptno = deptx.deptno and rownum<=1) loc
   from emp
 
DEPTNO ENAME            SAL DNAME          LOC
------ ---------- --------- -------------- -------------
    20 SMITH          99.00 RESEARCH       DALLAS
    30 ALLEN          99.00 SALES          CHICAGO
    30 WARD           99.00 SALES          CHICAGO
    20 JONES          99.00 RESEARCH       DALLAS
    30 MARTIN         99.00 SALES          CHICAGO
    30 BLAKE          99.00 SALES          CHICAGO
    10 CLARK          99.00 ACCOUNTING     NEW YORK
    20 SCOTT          99.00 RESEARCH       DALLAS
    10 KING           99.00 ACCOUNTING     NEW YORK
    30 TURNER         99.00 SALES          CHICAGO
    20 ADAMS          99.00 RESEARCH       DALLAS
    30 JAMES          99.00 SALES          CHICAGO
    20 FORD           99.00 RESEARCH       DALLAS
    10 MILLER         99.00 ACCOUNTING     NEW YORK
 
14 rows selected
這裡看可以從結果看出10返回的是對應的NEW YORK而不是yyy

出現問題的在於deptno做連線這個地方,emp的deptno是外來鍵,它的參照列是dept的deptno,dept.deptno作為人家外來鍵的參照列應該是主鍵約束,通俗的說
dept是emp的維度表,那麼這裡出現了一個緯度號對應了多個緯度列

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10678398/viewspace-695728/,如需轉載,請註明出處,否則將追究法律責任。

相關文章