1. 程式人生 > >SQL開發:用笛卡爾積+分組條件分組

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

SQLand和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),又