SQL開發:用笛卡爾積+分組條件分組
1、問題引出
學生們參加了10個課程的考試。每門課按成績分佈分成3等。
要求將學生每門課程分等。
- 學生成績表_事實表
stdno學生號 | clsno課程號 | sc成績 |
---|---|---|
1 | 1 | 37 |
1 | 2 | 33 |
1 | 3 | 43 |
2 | 1 | 32 |
2 | 2 | 71 |
2 | 3 | 69 |
- 課程成績分級表
CLSNO課程號 | RANK1成績等級 | SCMIN分組下線 | SCMAX分組上線 |
---|---|---|---|
1 | 1 | 0 | 8 |
1 | 2 | 8 | 25 |
1 | 3 | 25 | 100 |
2 | 1 | 0 | 38 |
2 | 2 | 38 | 55 |
2 | 3 | 55 | 100 |
成績0~100,分割槽使用前開後閉
2、第一方法
本能反應:用遊標的方法,遍歷學生的每個成績,再與對應課程的分級規則對比,判定成績等級。
虛擬碼:
for c in (學生id,課程id,成績) loop
select 成績等級1 from 分等表 where 課程id=c.課程id and c.成績 between 分等上線 and 分等下線;
update tab_學生成績
set 成績等級=成績等級1
where 學生id=c.學生id
and 課程id=c.課程id;
end loop;
缺點:
學生成績表是事實表,實際資料量可能很大,遊標遍歷、再回頭更新記錄,效率肯定不高
3、更優方法
能否有集合、批量的方式呢?一個sql就完成了全部課程的分等,不需要遊標。
1. 學生成績表與課程分級表 通過 課程id關聯,這樣課程成績形成笛卡爾積
2. 在關聯的全集結果裡,挑選成績在分等上下限裡的,過濾無意義的笛卡爾積。
sql
select a.*, b.*
from a, b
where a.clsno = b.clsno
and a.sc > b.scmin
and a.sc <= b.scmax
order by a.stdno, a.clsno
4、思路關鍵點
1)集合思維,儘量不要一條條處理記錄
2)where條件可以轉換到select結果欄位裡,一個欄位類似一個標籤,通過標籤的組合形成類似多種where的組合。
一般情況,一個sql只有一種where(或者一種資料集);這個方法,是資料全集,但對不同的資料做了集合標籤
ps:sql不復雜,為啥寫出來?在獲取更優方法前,自己沒有明確的思路導向,只是覺得方法一不優,尤其在事實表巨大的情況下。
能否事實表只查一次?後來才有了更優方法。希望梳理下適配場景,作為一種固定的思路模型。
5、適配場景
1)大事實表,不想對大表多次查詢
2)多維度分組
3)打標籤
4)where條件轉select欄位
ps:示例是個簡單的說明,真實的業務場景比這個複雜,也更能體現方法二的優勢,讀者儘量體會意思。
相關推薦
SQL開發:用笛卡爾積+分組條件分組
1、問題引出 學生們參加了10個課程的考試。每門課按成績分佈分成3等。 要求將學生每門課程分等。 - 學生成績表_事實表 stdno學生號 clsno課程號 sc成績 1 1 37 1 2 33
和我一起學程式設計系列(1):一文讓你讀懂資料庫聯合查詢(sql joins)的原理,笛卡爾積
格式和我原來的不一致,將就看吧 和我一起學程式設計系列(1):-1.補充,笛卡爾積的概念 首先得有兩個集合, A={1,2},B={3,4}A={1,2},B={3,4} 那麼他們的笛卡爾積就是: 即他們的笛卡爾積CC
sql 如何避免出現笛卡爾積運算
如何避免出現笛卡爾積運算. 如何避免出現笛卡爾積運算. 兩表關聯的時候通過最小的粒度關聯 SQL>create volatile MULTISET TABLE tb_test_01 ( statis_month number(6) ,area_code var
還需要註冊的是我們還有一個是“交差集”?cross?join,?這種Join沒有辦法用文式圖表示,因為其就是把表A和表B的數據進行一個N*M的組合,即笛卡爾積。表達式如下:
笛卡爾 tab 表達 但是 rom 產生 OS 是我 語法 還需要註冊的是我們還有一個是"交差集" cross join, 這種Join沒有辦法用文式圖表示,因為其就是把表A和表B的數據進行一個N*M的組合,即笛卡爾積。表達式如下: SELEC
19 Oracle資料庫SQL開發之 笛卡爾積
19.Oracle資料庫SQL開發之 笛卡爾積如果在多表查詢中不指定連線條件,就會導致將一個表中的所有行都連線到另外一個表中的所有行上。稱為笛卡爾積。如果第一個表包含50行,第二個表包含100行,那麼將返回5000行。例如:SQL>select pt.product_ty
SQL用and和or多表查詢笛卡爾積
原因:and或or都要有過濾條件才行,比如 SELECT T1.* from T_DC_ORDER_CENTER_DETAIL T1, TD_S_COMMPARA T2 WHERE T1.CH
sql中的笛卡爾積
簡單的 有序 想要 所有 rod car strong 多表 笛卡爾 sql中的笛卡爾積 我們對數據庫表進行操作時,經常會對多張表進行關聯,多表連接查詢大家肯定不會陌生,但是一不小心很容易出來龐大冗余的數據。 笛卡爾積數學概念 笛卡爾積是
SQL Server Join 聯接和笛卡爾積問題
一、(多表)連線方式分類 T-SQL提供兩種連線方式:傳統方式和SQL連線方式 1.傳統方式: SELECT 列1,列2,列3....&n
多表查詢,笛卡爾積 ,可視化工具,pymysql查詢與增刪改 ,sql 註水
增刪改 log .com cursor 執行 gin lar 模塊 內容 sql 註水import pymysqlconn=pymysql.connect(host=‘localhost‘,port=3306, db=‘db1‘,use
多表查詢,笛卡爾積 ,視覺化工具,pymysql查詢與增刪改 ,sql 注水
sql 注水import pymysqlconn=pymysql.connect(host='localhost',port=3306, db='db1',user='user',password='root')cur=conn.cursor(cursors.DictCu
sql join 降低笛卡爾積結果集
兩張表資料行若很大,笛卡爾積數量是非常龐大的,如何降低呢? 查詢sql形如: SELECT C.customerid, COUNT(O.orderid) AS numorders FROM dbo.Customers AS C LEFT OUTER JOIN dbo.
資料庫Oracle之多表查詢:笛卡爾積、等值連線、不等值連線、外連線,自連線
select e.empno, e.ename, e.sal, s.grade from emp e, SALGRADE s where e.sal >= s.losal and e.sal <= s.hisal -- where e.sal between s.
SQL語句的並集UNION,交集JOIN(內連線,外連線),交叉連線(CROSS JOIN笛卡爾積),差集(NOT IN)
1.a. 並集UNIONSELECT column1, column2 FROM table1UNIONSELECT column1, column2 FROM table2b. 交集JOINSELECT * FROM table1 AS a JOIN table2 b ON
成績錄入SQL語句 笛卡爾積 LEFT JOIN
select * from (select * from Student s,Course c ,(select distinct Year from Score) as y,(select dist
多數組組合笛卡爾積算法
length 卡爾 ring private == mmm null 數組組合 lis private string[] bianli(List<string[]> al) { if (al.Count == 0)
實操-mysql表連接笛卡爾積(join、left join)
卡爾 desc 順序 join mysql png blog 關系 方式 1、為什麽兩張表連接會出現重復數據 2、表的連接過程是怎樣的? 舉例: 表A: 1 0 表B: 1 0 0 2 執行語句:select *
js編寫一個數組笛卡爾積算法
con str console class span [] 個數 nts 一個數 function getProducts(specs) { if (!specs || specs.length == 0) { return []; } e
關於笛卡爾積陷阱的實例
實例 我們 進行 select distinct values reat ont 卡爾 下面的代碼演示了笛卡爾積陷阱的相關實例。 /*當我們采用以下語句進行查詢的時候,得到的結果遠超過我們需要的量。*/select a.userID,B.username,A.value,
php中將多個數組組合成笛卡爾積
在做商品屬性時設計到多個屬性直接引數的組合,因此用到了笛卡爾積這個概念。主要函式原理是利用遞迴的原理和求兩個陣列的笛卡爾積。 首先是陣列結構,如下:也可以根據實際情況修改為$a = Array();$b=Array();即可。 array (size=2) 0 =>
PHP笛卡爾積
先附上原地址:https://www.cnblogs.com/ghjbk/p/6992743.html?utm_source=itdadao&utm_medium=referral 笛卡爾積 笛卡爾積是指在數學中,兩個集合X和Y的笛卡爾積(Cartesian product),又