中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SPL 簡化 SQL 案例詳解:多級關聯

發布時間:2020-07-17 18:30:19 來源:網絡 閱讀:163 作者:raqsoft 欄目:大數據

在數據庫應用開發中,我們經常需要面對復雜的SQL式計算,多級關聯就是其中一種。SQL的join語句比較抽象,只適合表達簡單的關聯關系,一旦關聯的層級較多,相應的代碼就會變得非常復雜。而SPL則可以利用對象引用來表達關聯關系,從而使代碼更加直觀,下面就用一個例子來加以說明。

表channel存儲著某網站所有的頻道及其上級頻道的對應關系,分別用ID和PARENT字段來表示,最多四級,其中root代表網站本身(即根節點)。表中部分數據如下:

IDPARENTNAME
p1rootnews
p2roothealth
p3rootmanage
c11p1Scenic Introduction
c12p1Places of Interest
c13p1Local culture
c21p2Scenic Service
c22p2E-commerce
c31p3Travel Tips
d111c11Investment Projects
d112c11Virtual tour
d113c11Places of Interest
d114c11Historical legends
d115c11Resort weather
d121c12Ticket booking

現在想要根據參數輸入的ID,分層列出該頻道所有下級的名稱,同一層的下級之間用逗號分隔。假設參數arg1的值是p1,我們期望的結果如下圖所示:

SPL 簡化 SQL 案例詳解:多級關聯

SPL代碼如下:


AB
1=db.query("select * from ? channel")>A1.switch(PARENT,A1:ID)
2=create(ID,LEVEL,SUB)
3=A1.select(PARENT.ID==arg1)>A2.insert(0,arg1,1,A3.(NAME).string())
4=A1.select(PARENT.PARENT.ID==arg1)>A2.insert(0,arg1,2,A4.(NAME).string())
5=A1.select(PARENT.PARENT.PARENT.ID==arg1)>A2.insert(0,arg1,3,A5.(NAME).string())
6>file("channel.xlsx").xlsexport@t(A2)

A1:查詢表channel,部分結果如下圖所示:

SPL 簡化 SQL 案例詳解:多級關聯

B1:>A1.switch(PARENT,A1:ID),使用函數switch將表中PARENT字段替換成對應的記錄引用,如下圖所示:

SPL 簡化 SQL 案例詳解:多級關聯

切換后,可以直接用PARENT.ID來表示上級(父)頻道,而PARENT. PARENT. PARENT.ID則可以直接表示上三級(曾祖父)頻道。雖然在SQL中也可以用join來表示這種自連接,但層級多了后顯然容易產生混亂。

A2:=create(ID,LEVEL,SUB),建立一個空序表,用來存儲最終的計算結果。

A3:=A1.select(PARENT.ID==arg1),從表中查詢出上級(父)頻道等于參數arg1的記錄,即:arg1的下一級(子)頻道。計算結果如下:

SPL 簡化 SQL 案例詳解:多級關聯

B3:>A2.insert(0,arg1,1,A3.(NAME).string()),在A2中追加一條記錄,第一個字段值是arg1;第二個字段值為1,表示第一級子頻道;第三個字段為表達式A3.(NAME).string(),表示取出A3中的列NAME,拼成逗號分隔的字符串。計算結果如下:

SPL 簡化 SQL 案例詳解:多級關聯

A4:=A1.select(PARENT.PARENT.ID==arg1),這句代碼和A3類似,表示從表中查詢出arg1的下兩級(孫子)頻道。結果如下:

SPL 簡化 SQL 案例詳解:多級關聯

A5和A4類似,表示取出arg1的下三級(曾孫)頻道。用類似的辦法可以輕松取出下N級的頻道。

B4、B5和B3類似,都是向A2中追加新記錄,只是level字段改為2和3。執行完B5后,A2就是本次運算的最終結果:

SPL 簡化 SQL 案例詳解:多級關聯

剛才參數arg1的值為p1,如果輸入c12,則計算結果如下:

SPL 簡化 SQL 案例詳解:多級關聯

有時我們希望看到更清晰的數據,比如將某個頻道的所有下級頻道一條條列出,并標出層級關系。如下圖所示:

SPL 簡化 SQL 案例詳解:多級關聯

要想實現這種算法,可以使用下面的代碼:


AB
1=db.query("select * from ? channel")>A1.switch(PARENT,A1:ID)
2=create(ID,LEVEL,SUB)
3=A1.select(PARENT.ID==arg1)=A2.insert(0,arg1,1,A3)
4=A1.select(PARENT.PARENT.ID==arg1)=A2.insert(0,arg1,2,A4)
5=A1.select(PARENT.PARENT.PARENT.ID==arg1)=A2.insert(0,arg1,3,A5)
6=A2.(~.SUB.new(A2.ID,A2.LEVEL,ID:SUBID,NAME))
7=A6.union()

紅色字體為變動后的代碼,其中B3中的代碼是=A2.insert(0,arg1,1,A3),這表示直接將A3的記錄存儲在A2中,假設參數arg1的值為p1,則計算結果如下:

SPL 簡化 SQL 案例詳解:多級關聯

點開SUB字段,可以看到詳細的記錄:

SPL 簡化 SQL 案例詳解:多級關聯

可以看到,SPL的字段值是泛型的,可以存儲記錄組,或者單條記錄。而函數switch的本質就是將外鍵切換為主表中對應的記錄。

執行完B5后,A2中的結果如下:

SPL 簡化 SQL 案例詳解:多級關聯

A6:=A2.(~.SUB.new(A2.ID,A2.LEVEL,ID:SUBID,NAME)),用來將A2中ID和LEVEL拼到SUB字段里的每條記錄中。其中A2.()表示對A2進行計算,計算中可以使用“~”來表示A2中的每條記錄,~.SUB則表示每條記錄的SUB字段(記錄組)。函數new用來生成新的序表,即:A2中的ID字段、LEVEL字段,SUB中的ID字段、NAME字段。計算完成后,A6的值如下:

SPL 簡化 SQL 案例詳解:多級關聯

A7=A6.union(),這句代碼用來將A7的各組記錄拼在一起,形成最終計算結果:

SPL 簡化 SQL 案例詳解:多級關聯

有時我們需要直接列出每個頻道的所有下級頻道。要想實現這種算法,可以使用SPL的for語句,代碼如下:


ABC
1=db.query("select * from ? channel")>A1.switch(PARENT,A1:ID)
2=create(ID,LEVEL,SUB)

3for A1.(ID)=A1.select(PARENT.ID==A3)=A2.insert(0,A3,1,B3)
4
=A1.select(PARENT.PARENT.ID==A3)=A2.insert(0,A3,2,B4)
5
=A1.select(PARENT.PARENT.PARENT.ID==A3)=A2.insert(0,A3,3,B5)
6=A2.(~.SUB.new(A2.ID,A2.LEVEL,ID:SUBID,NAME))

7=A6.union()

A3中的代碼for A1.(ID)表示循環A1的ID字段,每次取出一條,可以用循環語句所在的單元格A3來表示循環變量。循環的作用范圍可以用縮進來表示,例子中的循環范圍就是B 3:C5。最終的計算結果在A7中,部分數據如下:

SPL 簡化 SQL 案例詳解:多級關聯

從這些例子可以看出,使用SPL簡化多級關聯問題時,思路直觀明了,代碼簡潔易懂,層級關系清晰可見。與SQL相比,這樣的SPL代碼可以大幅度降低開發成本,并極大地簡化后期優化和維護工作。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南靖县| 奉节县| 肇州县| 梓潼县| 河东区| 呼和浩特市| 江陵县| 连平县| 辽阳市| 拉孜县| 南华县| 宁德市| 疏附县| 新密市| 富源县| 哈尔滨市| 呼图壁县| 隆回县| 乌苏市| 秦皇岛市| 察雅县| 祁连县| 固阳县| 昌都县| 盈江县| 堆龙德庆县| 灵石县| 潞城市| 齐齐哈尔市| 石狮市| 博湖县| 盐亭县| 鹤岗市| 界首市| 赤城县| 酒泉市| 东莞市| 鹿泉市| 东乌| 永定县| 文化|