用Oracle的解析函數發現序列間隙

來源:互聯網
上載者:User

資料庫表格中經常用到值序列。無論是作為資料本身自然產生的,還是由Oracle 的序列對象分配的,它的目的就是用一個唯一的、遞增的數字給每一行編號。

在編號的過程中,產生間隙的原因多種多樣。如果一個預存程序從一個序列中挑選某個數字,定為本地變數,但是從來不用它,這個數字就丟失了。它將不能再返回到原序列中,結果就造成數值序列中存在一個間隙。關係型資料庫模型中不必擔心這一點。但是有時候人們在意這一點,這些人想知道是哪些數字丟失了。

一個顯而易見的方式就是用PL/SQL:在已排序指標中迴圈,並且用一個本地變數進行儲存,把每一個數值與其前一行的進行比較。這種方法的問題在於效率很低,速度很慢。另外一個不常用的解決辦法就是對錶格做一個自合并,實質也就是用某種標準使每一行與其前一行相匹配。這種方法很難編寫代碼。

Oracle的解析函數為檢查間隙提供了一種要快捷得多的方法。它們使你在使用完整的、面向集合的SQL處理的同時,仍然能夠看到下一個行(LEAD)或者前一行(LAG)的數值。

下面是這些函數的格式:

{LEAD | LAG} (value_expression, offset, default)

OVER ([PARTITION BY expr] ORDER BY expr)

通常,value_expression是一個你想要檢索的資料列。參數offset是指你想要往前或往後讀取的行數,default則是到達任意一個分區的開頭或者結尾(即沒有與之相匹配的行)時返回的數值。

列表A中的指令碼是一系列從工作地感應器自動收集來的資料。感應器裝置自動給每一個測量值編上號,我們要找出結果有沒有缺失。

在列表B中,我們將資料按照測量值編號排序,運用LAG函數,把位移量設定為1,使得每一行與其前一行對應起來。第一行將沒有對應量,所以相應地,將返回預設值0。因為間隙不可能發生在第一行,所以我們通過之前要求測量值大於0而將其刪除。

剩下的就是一組虛擬行,顯示的是前一行的測量值編號(“before_gap”)和當前行的測量值編號(“after_gap”)。如果兩者之差大於1,就說明這兩行之間存在間隙。

同時也要注意到,WITH子句在查詢開始的時候把解析子查詢命名為“aquery”。那麼我們就可以在主SELECT 語句中的WHERE 子句中訪問“aquery”中的數列。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.