-- Start
我們先來看兩個表的定義:
--使用者CREATE TABLE EMPLOYEE(USERID NUMBER(9,0) NOT NULL,---使用者IDCOMPANYID NUMBER(9,0),---公司IDTELNO VARCHAR2(12)---使用者電話);ALTER TABLE "EMPLOYEE" ADD CONSTRAINT "PK_EMPLOYEE" PRIMARY KEY ("USERID");--公司CREATE TABLE COMPANY(COMPANYID NUMBER(9,0) NOT NULL,---公司IDTELNO VARCHAR2(12)---公司電話);ALTER TABLE "COMPANY" ADD CONSTRAINT "PK_COMPANY" PRIMARY KEY ("COMPANYID");
大家對子查詢都非常熟悉,可是我發現,很多人都不知道子查詢有兩種格式:一種是相互關聯的子查詢(Correlated Sub-Query),另一種是非相互關聯的子查詢(Uncorrelated Sub-Query)。下面我們通過一個例子來對比一下這兩種子查詢的不同。假設現在讓你查詢一下公司電話是88888888 的使用者有哪些,我們可以使用如下語句:
--非相互關聯的子查詢(Uncorrelated Sub-Query)SELECT * FROM EMPLOYEE WHERE COMPANYID IN(SELECT COMPANYID FROM COMPANY WHERE TELNO='88888888');--相互關聯的子查詢(Correlated Sub-Query)SELECT * FROM EMPLOYEE U WHERE EXISTS(SELECT * FROM COMPANY C WHERE TELNO='88888888' AND U.COMPANYID=C.COMPANYID);
以上兩條語句的用作是相同的,對比後我們發現,相互關聯的子查詢的子句(也就是括弧中的語句:ELECT * FROM COMPANY C WHERE TELNO='88888888' AND U.COMPANYID=C.COMPANYID)依賴外部語句的條件,不能單獨執行;而非相互關聯的子查詢的子句是可以單獨執行的。就以上這個例子來說,我們使用相互關聯的子查詢無論從效能和可讀性都不如非相互關聯的子查詢,下面我們來看一個使用非相互關聯的子查詢辦不到的例子,假設現在讓你把使用者電話更新成公司電話,怎麼辦。有些人可能採用如下的方式構造update sql,然後執行,如下:
SELECT 'UPDATE EMPLOYEE SET TELNO=''' || TELNO || ''' WHERE COMPANYID=' || CHAR(COMPANYID) || ';' FROM COMPANY
這麼做是可以的,但是有點笨(當然,自己覺得挺聰明,因為他可能覺得自己使用了別人不常用或不知道的using sql to make sql),我們還有更好的方法,就是採用相互關聯的子查詢,如下所示:
UPDATE EMPLOYEE U SET TELNO=(SELECT TELNO FROM COMPANY C WHERE U.COMPANYID=C.COMPANYID);
怎麼樣。是不是感覺自己很厲害,有沒有更簡單的辦法。看看下面的語句吧。
UPDATE (SELECT U.TELNO EMPLOYEE_TELNO, C.TELNO COMPANY_TELNO FROM EMPLOYEE U, COMPANY C WHERE U.COMPANYID=C.COMPANYID)SET EMPLOYEE_TELNO = COMPANY_TELNO;
--更多參見:Oracle SQL 精萃
-- 聲明:轉載請註明出處
-- Last edited on 2015-06-19
-- Created by ShangBo on 2015-06-19
-- End