成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

第31期:JOIN簡化 - 維度對齊

企業動態
本文為你講解SQL中用于多表關聯的JOIN運算的簡化——維度對齊,接下來這些例子中,最終的JOIN都是同維表。事實上,維度對齊還有主子表對齊的情況,不過相對罕見。

【數據蔣堂】第31期:JOIN簡化 - 維度對齊

我們先把上一期中雙子表對齊例子的SQL寫出來:

  1. SELECT Orders.id, Orders.customer, A.x, B.y FROM Orders 
  2. LEFT JOIN (SELECT id,SUM(price) x FROM OrderDetail GROUP BY id ) A ON Orders.id=A.id 
  3. LEFT JOIN (SELECT id,SUM(amount) y FROM OrderPayment GROUP BY id ) B ON Orders.id=B.id 
  4. WHERE A.x > B.y 

那么問題來了,這顯然是個有業務意義的JOIN,它算是前面所說的哪一類呢?

這個JOIN涉及了表Orders和子查詢A與B,仔細觀察會發現,子查詢帶有GROUP BY id的子句,顯然,其結果集將以id為主鍵。這樣,JOIN涉及的三個表(子查詢也算作是個臨時表)的主鍵是相同的,它們是一對一的同維表,仍然在前述的范圍內。

但是,這個同維表JOIN卻不能用上一期說的寫法簡化,子查詢A,B都不能省略不寫。

可以簡化書寫的原因在于:我們假定事先知道數據結構中這些表之關聯關系。用技術術語的說法,就是知道數據庫的元數據(metadata)。而對于臨時產生的子查詢,顯然不可能事先定義在元數據中了,這時候就必須明確指定要JOIN的表(子查詢)。

不過,雖然JOIN的表不能省略,但關聯字段總是主鍵,已經在GROUP BY中寫過了,就沒有必要再寫一遍了;而且,子查詢的主鍵總是由GROUP產生,而GROUP BY的字段一定要被選出用于做外層JOIN,也沒必要在GROUP和SELECT中各寫一次;并且這幾個子查詢涉及的子表是互相獨立的,它們之間不會再有關聯計算了,我們就可以把GROUP動作以及聚合式直接放到主句中,從而消除一層子查詢:

  1. SELECT Orders.id, Orders.customer, OrderDetail.SUM(price) x, OrderParyment.SUM(amount) y 
  2. FROM Orders LEFT JOIN OrderDetail GROUP BY id LEFT JOIN OrderPayment GROUP BY id 
  3. WHERE A.x > B.y 

這里的JOIN和SQL定義的JOIN運算已經差別很大,完全沒有笛卡爾積的意思了。而且,也不同于SQL的JOIN運算將定義在任何兩個表之間,這里的JOIN,OrderDetail和OrderPayment以及Orders都是向共同的主鍵id靠攏,即所有表都向某一套基準維度對齊。而由于各表的維度(主鍵)不同,對齊時可能會有GROUP BY,在引用該表字段時就會相應地出現聚合運算。OrderDetail和OrderPayment甚至Orders之間都不直接發生關聯,在書寫運算時當然就不用關心它們之間的關系,甚至不必關心另一個表是否存在。而SQL那種笛卡爾積式的JOIN則總要找一個甚至多個表來定義關聯,一旦減少或修改表時就要同時考慮關聯表,增大理解難度。

我們稱這種JOIN稱為維度對齊,它并不超出我們前面說過的三種JOIN范圍,但確實在語法描述上會有不同,這里的JOIN不象SQL中是個動詞,卻更象個連詞。而且,和前面三種基本JOIN中不會或很少發生FULL JOIN的情況不同,維度對齊的場景下FULL JOIN并不是很罕見的情況。

雖然我們從主子表的例子抽象出維度對齊,但這種JOIN并不要求JOIN的表是主子表(事實上從上一篇的語法可知,主子表運算還不用寫這么麻煩),任何多個表都可以這么關聯,而且關聯字段也完全不必要是主鍵或主鍵的部分。

設有合同表,回款表和發票表:

設有合同表,回款表和發票表

現在想統計每一天的合同額、回款額以及發票額,就可以寫成:

  1. SELECT Contract.SUM(price), Payment.SUM(amount), Invoice.SUM(amount) 
  2. FROM Contract GROUP BY date FULL JOIN Payment GROUP BY date FULL JOIN Invoice GROUP BY date 

這幾種JOIN情況還可能混合出現。

延用上面的合同表,再有客戶表和銷售員表

延用上面的合同表,再有客戶表和銷售員表

其中Contract表中customer字段是指向Customer表的外鍵。

現在我們想統計每個地區的銷售員數量及合同額:

  1. SELECT Sales.COUNT(1), Contract.SUM(price) 
  2. FROM Sales GROUP BY area FULL JOIN Contract GROUP BY customer.area 

維度對齊可以和外鍵屬性化的寫法配合合作。

這些例子中,最終的JOIN都是同維表。事實上,維度對齊還有主子表對齊的情況,不過相對罕見,我們將在后續仔細講解維度概念時再涉及,上述寫法中其實還有個小漏洞,有了明確的維度定義后才能將這個漏洞補上。

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2018-01-01 23:28:37

JOIN維度數據分析

2017-11-15 06:36:25

JOINSQL運算

2017-12-10 22:42:50

JOINSQL運算

2018-01-10 15:25:43

JOIN維度SQL

2018-01-10 15:19:59

JOIN維度SQL

2017-11-08 06:18:43

JOINSQL運算

2017-12-26 15:33:24

JOINSQL運算

2017-12-10 22:48:53

JOIN運算外鍵

2017-12-12 22:58:57

JOIN外鍵運算

2011-10-14 13:44:57

2016-08-08 10:14:50

智造+V課堂信息化

2013-01-21 13:41:59

IBMdW

2017-10-09 22:33:56

SQL等值分組有序分組

2017-09-05 22:34:24

遍歷SQL運算

2017-10-18 22:34:33

SQL等值分組有序分組

2018-01-18 20:47:18

CPU數據線程

2018-01-24 07:45:51

數據倍增分段列存

2017-09-13 08:45:33

遍歷SQL運算

2018-02-06 23:30:07

文件存儲數據

2017-05-25 08:56:22

硬盤性能特征
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区三区四区在线观看 | 国产欧美一区二区精品久导航 | 中文字幕国产日韩 | 91亚洲一区 | 美女爽到呻吟久久久久 | 欧美一区二区三区在线观看 | 人碰人操 | 亚洲精品毛片av | 麻豆视频在线免费看 | 亚洲精品成人在线 | 日韩在线一区二区 | www亚洲精品 | 欧美男人天堂 | 国产99热精品 | 亚洲精品自在在线观看 | 99精品视频一区二区三区 | 亚洲欧美日韩精品 | 久久久久免费观看 | 成人精品视频免费 | 日韩在线视频一区二区三区 | 久久久久久久综合 | 天天操天天射综合 | 国产精品伦一区二区三级视频 | 久久综合九色综合欧美狠狠 | 成人午夜网 | 福利视频网站 | 日本一二三区电影 | 亚洲视频一区在线 | 羞羞视频在线观看免费观看 | 国产精品2区 | 国产精品国产三级国产播12软件 | 国产精品99999 | 黄色一级特级片 | aacc678成免费人电影网站 | 爱爱免费视频网站 | 亚洲欧美国产毛片在线 | 国产精品区二区三区日本 | 天天天天操 | 久久亚洲国产 | 国产一区二 | 国产一区91精品张津瑜 |