由Oralce的左右連線想到的

2021-04-21 17:58:12 字數 2987 閱讀 4243

以前也看了不少關於sql的左右連線的內容,都是全部顯示其中乙個表的全部內容。也許是內容太抽象,或是自己平常用的少,具體如何使用?如何去思考如何用這個左右連線?雖然這是乙個很簡單的問題,由於最近做專案,剛好有了這方面的思考!

以下用的情況是oracle8i,因為專案關係,其實只要原理一樣,不管不用管資料庫是不是一樣,甚至不用管寫法是不是不一樣!

先思考乙個問題,有兩張表。乙個地區表tb_area,有2個字段,area_id,aea_name。乙個地區銷售統計表tb_stat,有3個字段,stat_id,stat_area_id,stat_num。

現在開始建表:

create table tb_area

(area_id number,

area_name varchar2(20)

);create sequence seq_tb_area_id;

create table tb_stat

(stat_id number,

stat_area_id number,

stat_num number

);create sequence seq_tb_stat_id;

填充資料:tb_area

declare

x number;

begin

x:=1;

while x<=100 loop

insert into tb_area values (seq_tb_area_id.nextval,'area-'||x);

x:=x+1;

end loop;

end;

填充資料:tb_stat (僅插入試驗資料,資料隨便填寫,這裡我只插4記錄)

insert into tb_stat values(seq_tb_stat_id.nextval,2,20)

insert into tb_stat values(seq_tb_stat_id.nextval,5,11)

insert into tb_stat values(seq_tb_stat_id.nextval,8,22)

insert into tb_stat values(seq_tb_stat_id.nextval,1,52)

...

注意:這裡為了方便測試試驗,tb_stat的記錄僅限制乙個地區對應乙個數量統計,即乙個地區乙個記錄,且該錶記錄的地區少於tb_area所含有的所有的地區數。即對於tb_area的地區而言,tb_stat的地區是其的部分分布。

提出需求:查詢所有有數量統計的地區及其所在地區的數量

select a.area_name,b.stat_num from tb_area a,tb_stat b where a.area_id = b.stat_area_id

結果如圖:

提出需求:要求檢視所有地區的統計分布(這裡就要求首先必須顯示全部的地區資料,並根據地區資料檢視tb_stat顯示該地區是否有統計,有就顯示stat_num,沒有就顯示0)

select a.area_name,

case when

isnull(b.stat_num) then 0

else then

b.stat_num

endfrom tb_area a,tb_stat b where a.area_id = b.stat_area_id(+)

現在如何理解這個結果集?

可這麼理解這個查詢結果集的組成過程!先查詢tb_area的area_name,此時有一列資料,假定為a列,再查詢tb_stat的stat_num,此時有一列資料,假定為b列,看到後面的(+)嗎?(+)表示的是有(+)那邊的那個查詢的表的結果即b列會經過一系列處理得到乙個c列,然後顯示a+c列(此時可看a列的結果集合作為基礎列,後面的新增c列僅是對a列進行組合操作)。該處理就是先比對是否a.area_id = b.stat_area_id,如果a.area_id = b.stat_area_id為真,則按照a列area_id的順序顯示該資料,如果出現b列中沒有而a列的地區,則顯示null,這裡我用case處理了下,如果為空,則顯示0。

其實上面說了一大堆,說白了,多表查詢其實就是將各表的查詢結果按照某種條件進行拼接,最後得到乙個大的結果集。沒有條件,則進行笛卡爾運算,即按照其中乙個表的查詢結果中的一條記錄對應另乙個表的所有的記錄的形式進行顯示。只有條件的,將只顯示滿足條件的結果集,如果有左右連線,預示著資料庫還要考慮某個表的查詢結果是否全部顯示,還是部分顯示。

在乙個,如果有多個條件,會按照條件的先後順序進行左右連線處理。這個時候,你只要注意哪個作為基礎列(就是沒有(+)那邊的表,該錶將顯示所有的記錄)就可以得到自己想要的結果集。例如注意下面的不同

select a.area_name,

case when

isnull(b.stat_num) then 0

else then

b.stat_num

end num,

case when

isnull(c.stat_num) then 0

else then

c.stat_num

end num1

from tb_area a,tb_stat b,tb_stat c where a.area_id = b.stat_area_id(+)

and a.area_id = c.stat_area_id(+)

select a.area_name,

case when

isnull(b.stat_num) then 0

else then

b.stat_num

end num,

case when

isnull(c.stat_num) then 0

else then

c.stat_num

end num1

from tb_area a,tb_stat b,tb_stat c where a.area_id = b.stat_area_id(+)

and a.area_id(+) = c.stat_area_id

由PageRank想到的

首先來看看什麼是pagerank pagerank 技術 通過對由超過 50,000 萬個變數和 20 億個詞彙組成的方程進行計算,pagerank 能夠對網頁的重要性做出客觀的評價。pagerank 並不計算直接鏈結的數量,而是將從網頁 a 指向網頁 b 的鏈結解釋為由網頁 a 對網頁 b 所投的...

由Cannot find file 想到的

記錄一下 今天除錯程式,單步真機除錯,我日,程式一步一步走,盡然和程式根本就對不上號。特別奇怪。思考一下,應該是工程太多太雜,自己有不小心,讓它們混在一起打架了。於是繼續,把其它所有工程都關了,只開啟乙個,清理了所有工程。與此工程有關的直接搜尋清理,一直以來覺得沒有必要,但這次是為了保險起見。編譯工...

由VBA想到的

這段時間由於工作原因研究了一下 vba,感覺完全是如墜五里霧中,主要原因是對 atl乃至對 com技術的應用不了解。簡單說一下 vba,用過 office 系列軟體的朋友都知道它,用 vb語法來控制文件生成過程,很不錯。不只是 office,很多其它優秀軟體都有 vba模組,比如 autocad 這...