select子查詢
典型的寫法
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- select查詢之三:子查詢
- Select from subquery 子查詢
- 子查詢-表子查詢
- Mysql基礎+select5種子句 + 子查詢MySql
- select查詢之一:普通查詢
- select查詢之四:連線查詢
- 複雜查詢—子查詢
- SQL查詢的:子查詢和多表查詢SQL
- sql查詢更新update selectSQL
- 相關子查詢&非相關子查詢概念
- MySQL子查詢MySql
- 子串查詢
- 使用子查詢
- MYsql 子查詢MySql
- oracle子查詢Oracle
- 查詢子串
- 子查詢分解
- 11子查詢
- sql子查詢SQL
- informix子查詢ORM
- Hibernate中不支援複雜子查詢from (select ……)解決方案
- MySQL聯結查詢和子查詢MySql
- SQLServer DML操作阻塞SELECT查詢SQLServer
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- 區分關聯子查詢和非關聯子查詢
- sql語法相關子查詢與非相關子查詢SQL
- exist-in和關聯子查詢-非關聯子查詢
- MySQL之連線查詢和子查詢MySql
- 巢狀子查詢巢狀
- GORM subquery 子查詢GoORM
- SQL--子查詢SQL
- Oracle with重用子查詢Oracle
- oracle with 子查詢用法Oracle
- mysql的子查詢MySql
- Javaweb-子查詢JavaWeb
- select查詢之五:分析函式在查詢的運用函式
- 【閃回特性之閃回查詢】使用閃回查詢(select as of)
- MYSQL學習筆記25: 多表查詢(子查詢)[標量子查詢,列子查詢]MySql筆記