1. 程式人生 > >sql中自連接的使用

sql中自連接的使用

.com out www. color stop 得出 ref 條件語句 之間

一、用SQL自連接查詢處理列之間的關系

SQL自身連接,可以解決很多問題。下面舉的一個例子,就是使用了SQL自身連接,它解決了列與列之間的邏輯關系問題,準確的講是列與列之間的層次關系。SQL代碼如下:

1 SELECT FIRST.CNumber, SECOND.PCNumber2 FROM Course FIRST, Course SECOND3 WHERE FIRST.PCNumber=SECOND.CNumber;

 在這個代碼中,只涉及到一個表,即課程信息表COURSE(CNumber, CName, PCNumber),其中CNumber是該課程的課程號,PCNumber是該課程的先修課課程號。在FROM子句中,為Course表起了兩個不同的別名,即FIRST和SECOND,即為Course表創建了兩個不同的實例。查詢時,使用了條件語句WHERE,要求FIRST表中的先修課號PCNumber同SECOND表中的課程號CNumber相同,而查詢所需要的結果,是FIRST表的課程號CNumber和SECOND表中的PCNumber,那麽查詢結果,就應該是FIRST表中的課程號CNumber和該課程號所對應的間接先修課課程號。
  
  同樣的查詢,如果不使用自連接,而純粹是對單表本身進行操作,那將是非常困難的。假設在這個表中,有兩個元組(cnumber1, cname1, pcnumber1)和(cnumber2, cname2, pcnumber2),其中,pcnumber1=cnumber2。在同一個COURSE表上,關於課程號的信息,只有CNumber和PCNumber這兩個屬性,它們只能表示一個課程號(cnumber1)和該課程號直接先修課(pcnumber1=cnumber2)的一層關系。而間接先修課,需要求出cnumber1和pcnumber2的關系,這是一個二層關系。對於這個只能表示一層關系的表而言,如果純粹對單表進行操作而不使用自然連接,那麽一個可行的方案是,為Course表再增加一個列PPCNumber,令該列表示間接先修課,那麽,通過三個列,就可以表示這種二層關系了。
  通過這個例子以及對這個例子的分析,我們可以初步得出結論,自連接查詢,可以表示表中各列的層次關系。當所要查詢的信息都出於同一個表,而又不能直接通過該表的各個列的直接層次關系得到最終結果的時候,那麽應該考慮使用表的自連接查詢。
  

二、SQL自連接查詢表示其它關系

  除了處理前面例子中的列之間的層次關系之外,SQL自連接查詢還可用於處理列之間的順序關系、因果關系等多種邏輯關系。此外,SQL自身查詢還可以用於處理單列本身的邏輯關系。下面的例子,就說明了對單列的邏輯關系的處理。

1 SELECT FIRST.Num, FIRST Stop, SECOND.Stop2 FROM Route FIRST, Route SECOND3 WHERE FIRST.NUM=SECOND.NUM;

 這個代碼中,只涉及到一個表Route(Num, Stop),這個表可以表示某一線路的火車的車站線路信息。Num表示該車的車次號,Stop表示該次車停靠的城市名稱。上面的代碼,可以求出某一線路的火車可以聯通的任意兩個城市的名稱。
 在這裏例子中,連接的操作對象只有Num這一個列,通過相同的車次號,找出該列車聯通的任意兩個城市的信息。在這個例子中,原來表Route中的每一個元組,只能表示車號和該車的某一站點的信息,實際上,這是“1Vs1”的映射關系。如果要表示兩個站點的聯通關系,那麽就應該把兩個“1Vs1”關系合並,形成“1Vs多”的關系。我們利用自連接,很容易地解決了這個關系擴充的問題。
下面的這裏例子,是對單一的列進行連接處理:
 

1 SELECT FIRST.Num, SECOND.Num, FIRST.Stop2 FROM Route FIRST, Route SECOND3 WHERE FRIST.Stop=SECOND.Stop;

  
  上面的SQL代碼,求出了路經相同城市的車次的信息。原表中的車次和車站是“1Vs1”關系,通過自連接後,得到了車次和車站的“多Vs1”關系。

一些自連接代碼經典例子:

到目前為止,我們連接的都是兩張不同的表,那麽能不能對一張表進行自我連接呢?答案是肯定的。
有沒有必要對一張表進行自我連接呢?答案也是肯定的。

表的別名:
一張表可以自我連接。進行自連接時我們需要一個機制來區分一個表的兩個實例。
在FROM clause(子句)中我們可以給這個表取不同的別名, 然後在語句的其它需要使用到該別名的地方
用dot(點)來連接該別名和字段名。

我們在這裏同樣給出兩個表來對自連接進行解釋。
愛丁堡公交線路,

車站表:
stops(id, name)

公交線路表:
route(num, company, pos, stop)

關於這兩個表更詳細的解釋可以參考這裏:http://sqlzoo.cn/buses.htm

一、對公交線路表route進行自連接。

1 SELECT * FROM route R1, route R22 WHERE R1.num=R2.num AND R1.company=R2.company

我們route表用字段(num, company)來進行自連接. 結果是什麽意思呢?
你可以知道每條公交線路的任意兩個可聯通的車站。

二、用stop字段來對route(公交線路表)進行自連接。

1 SELECT * FROM route R1, route R22 WHERE R1.stop=R2.stop;

查詢的結果就是共用同一車站的所有公交線。這個結果對換乘是不是很有意義呢。

從這兩個例子我們可以看出,自連接的語法結構很簡單,但語意結果往往不是
那麽容易理解。就我們這裏所列出的兩個表,如果運用得當,能解決很多實際問題,
例如,任意兩個站點之間如何換乘。

1 SELECT R1.company, R1.num2 FROM route R1, route R2, stops S1, stops S23 WHERE R1.num=R2.num AND R1.company=R2.company4 AND R1.stop=S1.id AND R2.stop=S2.id5 AND S1.name=Craiglockhart6 AND S2.name=Tollcross


  
  總結
  
  同其它連接相比,SQL自連接查詢本身並沒有什麽特殊的。但是,在應用中,自連接查詢因為其語法結構簡單,而邏輯結構復雜,語義往往不是那麽容易被人理解,因此,在使用時,經常令人覺得迷惑不解。但只要把自連接運用的得當,把單表看成是多表,牢固樹立這一思維定式,我們會發現,自連接查詢會為我們解決很多復雜的問題。

原文地址:https://www.cnblogs.com/Hadley-pu/p/sql_selfconnect.html

sql中自連接的使用