1. 程式人生 > >SQLite3中的三種Join方式

SQLite3中的三種Join方式

前一陣子設計資料庫結構,有個設計是要儲存所有的音、視訊和圖片資訊的metadata到表中,並要求可以不分型別的一次全部檢索出來。原來有個設計是設計一張大表,把所有的欄位不分型別全都添進去,通過型別欄位進行判斷,讀取哪些metadata作為檢索結果。這樣就導致表的結構十分複雜,且大量的欄位為空。為了解決這個問題,查了一下SQL的Join演算法,解決了這個設計問題。以下是SQLite3中支援的Join方式及使用說明:

1. Cross Join

又叫笛卡爾積,匹配前一個表與後一個表的每一行和每一列,這樣得到的結果集為n*m行(n, m分別為每張表的行數),x+y列(x, y分別為每張表的列數)。可見,該結果集可能會成為一個巨大的表,對記憶體和後續處理都會造成巨大壓力,所以,慎用(真沒用過)。

語法:SELECT ... FROM t1 CROSS JOIN t2 ...

(盜用Using SQLite3 2010中的圖)

2. Inner Join

類似Cross Join,但內建機制限制了返回的結果數量。返回的結果集不會超過x + y列,行數在0- n*m行之間。有3種方法用來指定Inner Join的判斷條件:

第一種是On表示式:SELECT ... FROM t1 JOIN t2 ON conditional_expression ...,例如:SELECT ... FROM employee JOIN resource ON employee.eid = resource.eid ...。

但On這種方式有倆個問題:一是語句比較長,二是存在重複列,如倆個eid。因此,可以使用第二種方式Using表示式:SELECT ... FROM t1 JOIN t2 USING ( col1 ,... ) ...,這種Join返回的結果集中沒有重複的欄位,只是每個欄位必須存在於各個表中。

更簡潔的方式是,使用第三種方式Natural Join:SQL自動檢測各表中每一列是否匹配,這樣,即使表結構發生變化,也不用修改SQL語句,可以自動適應變化。

(繼續盜圖)

3. Outer Join

解決我的問題使用的是Outer Join。

SQLite3只支援left outer join,其結果集由不大於x + y列,n - n*m行構成,至少包含左側表的每一行,對於Join後不存在的欄位值,則賦NULL。這樣得到的表與我們之前設計那個全集結果一樣,但資料結構更清晰,空間佔用更少。

(最後一次盜圖)

相關推薦

SQLite3Join方式

前一陣子設計資料庫結構,有個設計是要儲存所有的音、視訊和圖片資訊的metadata到表中,並要求可以不分型別的一次全部檢索出來。原來有個設計是設計一張大表,把所有的欄位不分型別全都添進去,通過型別欄位進行判斷,讀取哪些metadata作為檢索結果。這樣就導致表的結構十分複雜,

Hive的Join方式

Hive中就是把Map,Reduce的Join拿過來,通過SQL來表示。 參考連結:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins Common/Shuffle/Reduce Join Reduce

xml解析方式介紹

1)dom: 文件物件模型(Document Object Model) 官方推薦的標準 dom原理:會把我們要解析的整個xml載入到到記憶體中.在記憶體中形成一個樹形結構 優點:可以進行增刪改查 缺點:由於把整個文件載入到記憶體中.所以會造成記憶體

iOS定位方式

原理 每個手機基站都有一個識別符號,iPhone或3G iPad可以蒐集周圍所有收到訊號的基站和它們的識別符號,通過聯網傳送到蘋果雲端伺服器,再由伺服器根據這些基站的的位置資訊查詢並計算出當前位置,然後返回給手機。因為基站訊號輻射範圍大,所以誤差也大,在500米 ~ 幾公里. 特點 定位速度最

JS編碼方式(escape,encodeURI,encodeURIComponent)

一 參考書 1  js編碼http://blog.csdn.net/cnartstorm/archive/2009/06/23/4292460.aspx2 js 解決中文亂碼函式-js中escape,encodeURI,encodeURIComponent三個函式的區別 h

.NetCore注入方式的思考

該篇內容由個人部落格點選跳轉同步更新!轉載請註明出處! .NetCore徹底詮釋了“萬物皆可注入”這句話的含義,在.NetCore中到處可見注入的使用。因此core中也提供了三種注入方式的使用,分別是: AddTransient:每次請求,都獲取一個新的例項。即使同一個請求獲取多次也會是不同的例項

sql註入過程後臺數據庫類型的判斷方式

sql註入 安全測試 數據庫類型判斷 後臺數據庫類型判斷:一、通過頁面返回的報錯信息,一般情況下頁面報錯會顯示是什麽數據庫類型,在此不多說;二、通過各個數據庫特有的數據表來判斷: 1、mssql數據庫 http://127.0.0.1/test.php?id=1 and (sele

Android常用解析XML的方式(DOM、SAX、PULL)簡介及區別

字符串 lan win name屬性 Coding 空間 toc log fin XML在各種開發中都廣泛應用,Android也不例外。作為承載數據的一個重要角色,如何讀寫XML成為Android開發中一項重要的技能。今天就由我向大家介紹一下在Android平臺下幾種常見的

Qt解析xml的方式

處理異常 AR ttr omd ostream odin move encoding efault 在下面的隨筆中,我會根據xml的結構,給出Qt中解析這個xml的三種方式的代碼。雖然,這個代碼時通過調用Qt的函數實現的,但是,很多開源的C++解析xml的庫,甚至很多其他語

c++參數引用方式

例子 機制 string ret 調用 esp roc tor cpp 傳值調用 是默認的參數傳遞機制,實參會復制給形參,調用的語義是每次取得實參的副本並將該復本用作形參,即會有復本的開銷,並且不改變實參的值。 適用於:傳值調用用於不應該被函數改變的小型對象。 例子:voi

servlet的介紹 & xml配置 以及 & 實現方式(補充設定瀏覽器不快取的方法)

開始時間:2018年10月13日20:53:30 | 2018年10月14日16:10:56 結束時間:2018年10月13日21:53:30 | 2018年10月14日17:02:23 累計時間:2小時 備註:幾乎每一句話都很有收穫,複習的時候務必要仔細一點 Servlet

OraclePL/SQL之 while、for、loop 迴圈方式的使用

PL/SQL  while、for、loop 三種迴圈方式的使用 1、WHILE ... LOOP ... END LOOP 語法: WHILE 條件 LOOP 語句; END LOOP; 例子:輸出1到5的數字 declare num number :

Spark SQL join實現方式

引言 join是SQL中的常用操作,良好的表結構能夠將資料分散到不同的表中,使其符合某種規範(mysql三大正規化),可以最大程度的減少資料冗餘,更新容錯等,而建立表和表之間關係的最佳方式就是join操作。 對於Spark來說有3種Join的實現,每種Join對應的不同的應用場景(SparkSQL自動決策

C++類的繼承方式public(公有繼承)、protected(保護繼承)、private(私有繼承)之間的差別(附思維導圖)【轉】

(轉自:https://blog.csdn.net/coco56/article/details/80467975) 注:若不指明繼承方式,則預設是私有繼承。 一:對於公有繼承(public)方式: 基類的public和protected成員的訪問屬性在派生類中保持不變,但基類的p

springcloudRestTemplate的使用方式

首先在A應用Controller中寫個方法 例如: package com.hlvy.hlvyeclient.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.spring

常量的定義方式和static在c語言修飾

c語言的常量在執行期間為固定值,在定義後無法被修改常量可以是任何的資料基本型別,可以為整形,浮點常量,字元和字串常量1,使用const關鍵字2, 使用巨集定義3,使用列舉常量   列舉: 1 #include<stdio.h> 2 int main(){ 3 e

SpringBean的裝配方式

bean的裝配通俗點就是依賴注入(spring的特點之一),再說通俗點就是類中屬性的賦值,而這種賦值不是由我們直接在程式碼中賦值,而是通過在配置檔案中配置值類實現的,給他起了一個高大上的名字,讓我來說就是把賦值包裝了一層還有一層呀。讓我們一起看看這三種裝配方式怎麼實現的吧!!

R檢驗正態分佈的方式

一、畫出密度函式與正態分佈密度圖比較: library(MASS) mu<- c(0,0,0) Sigma<- matrix(c(1,0.5,0.25,0.5,1,0.5, 0.25,0.5,1),3,3) M<- mvrnorm(1000,

SparkSQLJoin及其實現(broadcast join、shuffle hash join和sort merge join

1.小表對大表(broadcast join) 將小表的資料分發到每個節點上,供大表使用。executor儲存小表的全部資料,一定程度上犧牲了空間,換取shuffle操作大量的耗時,這在SparkSQL中稱作Broadcast Join Broadcast Jo

servlet的介紹 & xml配置 以及 & 實現方式(補充設定瀏覽器不快取的方法)

開始時間:2018年10月13日20:53:30 | 2018年10月14日16:10:56 結束時間:2018年10月13日21:53:30 | 2018年10月14日17:02:23 累計時間:3小時 動態資源: Servlet 簡單介紹:   Servlet