收藏 sql多表查詢之二 不等連線

2021-08-31 04:13:40 字數 1575 閱讀 1911

標籤: sql多表查詢

不等連線

今天我們要介紹的是sql多表查詢不等連線,想知道怎麼樣用一句sql得到每日的庫存結餘嗎,那麼你千萬不要錯過今天的內容!

可能有朋友要問了,什麼是不等連線呢?

通常來說,sql語言進行的都是無序操作。想要進行有序的處理,比如比較乙個序列的前後項,必須要使用游標。但是,在有些場合下,可採用另一種方法,不用游標,一樣能處理有序的資訊,這就是不等聯接。

看看下面的例子你就更加明白什麼是不等連線了。

我有一張表

現在我希望通過一條查詢語句使它變成

看到沒有,記錄數變多了,僅用我們之前學到的a join b where a.xx=b.yy 能解決問題嗎?

想想,再看答案

select _a.ordinal from @a _a join @a _b on _a.ordinal<=_b.ordinal

總結:

連線條件不為= 號的統稱不等連線

<>,> ,

這個例子有些抽象,也許大家會說,我用不上這種查詢

我給你看看下面這個案例,您就知道這個不等連線有多實用啦

做過企業資訊系統應該都知道進銷存吧,那麼,下面這是一張入庫明細表

它記錄了每天的入庫情況

現在我希望得到每個產品每次入庫之後的庫存變化情況,如下表所示:

這該怎麼辦呢?

直觀上來講,我們可以在入庫明細表上建乙個游標,從第一條開始,每一條,加一次。

也許有些朋友還可以想到用update,不錯啦!

但是,只有這些方法嗎???

當然不,我們可以用一句sql 搞定,相信嗎?

試試,再看答案

select

_b. 入庫日期,_a. 產品,sum(_a. 數量) 當前庫存

from @ 入庫表 _a

join @ 入庫表 _b

on _a. 產品=_b. 產品 and _a. 入庫日期<=_b. 入庫日期

group by _b. 入庫日期,_a. 產品

不等聯接本身就不是一一對應,它的對應關係和順序有著密切的關係。這也就是我們能夠拿它來進行有序操作的原因。這就是不等連線,這次知道了吧!

不等聯接查詢的有序操作能力,顯然來自聯接欄位的可排序和互異性,所以,最好不要在有重複值的字段上做不等聯接(事實上,最好不要在有重複值的字段上做任 何聯接,除非你非常肯定你在幹什麼)。等值聯接出現資料**就夠可怕的了,不等聯接要是玩爆了……嘿嘿嘿……

想像乙個等值聯接中有一對重複值,可能出現兩對重複結果。不過要是不等聯接,就和重複的位置有關了。因為這是乙個三角形,所以出現在最上面還好,要是出現在這個三角形的下部……

小忠告:不等聯接查詢,顯然是乙個有力的工具,但它也是招來麻煩的快捷方式之一。有幾個小忠告:

1、如果聯接會生成很大的「三角形」,就不要用,試試子查詢或哪怕游標;

2、生成的結果集相對於原表越小越好,盡可能地把無用的資料先過濾掉;

3、用不等聯接進行數列計算會表達的很清楚(因為是非過程化的),但通常在效率上它沒有什麼優勢,所以,平時玩玩可以,真用的話最好先考慮好;

4、還有就是不等聯接不要輕易用在多重聯接中,否則可能會引起槓桿作用。

SQL多表連線查詢

本文主要列舉兩張和三張表來講述多表連線查詢。新建兩張表 表1 student 截圖如下 表2 course 截圖如下 此時這樣建表只是為了演示連線sql語句,當然實際開發中我們不會這樣建表,實際開發中這兩個表會有自己不同的主鍵。一 外連線 外連線可分為 左連線 右連線 完全外連線。1 左連線 lef...

SQL多表連線查詢

本文主要列舉兩張和三張表來講述多表連線查詢。新建兩張表 表1 student 截圖如下 表2 course 截圖如下 此時這樣建表只是為了演示連線sql語句,當然實際開發中我們不會這樣建表,實際開發中這兩個表會有自己不同的主鍵。一 外連線 外連線可分為 左連線 右連線 完全外連線。1 左連線 lef...

SQL多表連線查詢

本文主要列舉兩張和三張表來講述多表連線查詢。新建兩張表 表1 student 截圖如下 表2 course 截圖如下 此時這樣建表只是為了演示連線sql語句,當然實際開發中我們不會這樣建表,實際開發中這兩個表會有自己不同的主鍵。一 外連線 外連線可分為 本文主要列舉兩張和三張表來講述多表連線查詢。新...