要了解 SQL join 要先從 Cartesian product 來解釋
如果 A 有3筆資料 , B 有4筆資料
AXB : (a, b) a belongs to A, b belongs to B. 就有12 種可能 .
X 稱為 cartesian product, 會產生 A, B 元素的所有組合所形成的集合.
如果用:
left join : 至少會留下3筆. 如果可以控制條件, 讓每個 a , 符合條件的 b 只會有一種可能. 則 join 後的結果只有3筆. left join 不一樣的地方就是以left 為主, 有match 到的會output, 每個a 可以有數個 b 同時成立, 如果沒宥 match 到的, a 還是會保留下來. 在b 上的output 值就會以 . (missing value) 存在. 此例 left join 最多還是有12筆的可能.
如果不想讓 A的資料消失不見, 可以用left join, 相同的道理, 如果不想讓B 資料消失不見, 可以用 right join,
例:left join
A: 3筆
AA 欄位名
1
2
3
B: 4筆
BB ser 欄位名
1 1
2 2
4 3
4 4
--------------------------------------
proc sql;
create table xx as
select a.*, b.*
from a as a left join b as b
on a.AA=B.BB; *用on;
output
xx
AA BB ser
1 1 1 ; 在 BB 中可以找到對的 a的 1=1
2 2 2 ; 在 BB 中可以找到對的 a的 2=2
3 . . ; 在 BB 無法找到 3 與其對應.
proc sql;
create table xx as
select a.*, b.*
from a as a left join b as b
on a.AA=2 & B.BB=4; *用on;
下面為 output xx
AA BB
1 . . ; 在 aa=2 的條件不成立, 所以b 的所有都不會成立, output為.
2 4 3 ; 在 aa=2 且 BB 中可以找到對的 4 (B 的第三筆)
2 4 4 ; 在 aa=2 且 BB 中可以找到對的 4 (B 的第三筆)
3 . . ; aa不等2. 條件未成立
#要小心: 如果不是唯一對應, 資料比數會變多.
Cartesian product :
使用 sql
SQL ..... From A,B; //不給條件會有12筆.
---------------
知道 Cartesian product 後, 還要知道 關連性資料庫, 這也是 SQL 語言的精神.
所以如果要將目前當筆資料前後的資料做計算, 或統計. 就要用 Cartesian product 將所有可能的CASE產生, 再建立條件與關係後, 將符合條件的資料留下來.
SQL ... from A, A;
SQL ... from A left join B;
有時候關係是上一筆, 或下一筆, 這如何做到, 這時候需要引進流水號的關念, 就可以比較容易設計出條件.
[Data Step] Cartesian product : Data step 如何做到?
data a; *10筆:X:1~10;
do x=1 to 10;
output ;
end;
data b; *4筆:Y:1~4;
do y=1 to 4;
output ;
end;
run;
data c; * Cartesian product of A and B;
set a;
* 對每個row of a, 用以下的do i, 取出 b 的 4個 row -> 10 x 4;
do i=1 to 4;
set b point=i ;
output;
end;
run;
----
#如果只用 set a b; 只會有 10 筆.
# set a b; 與 set a; set b; 分開二行是一樣的.
相關文章:
[Data Step][Sas] 徹底研究 DATA STEP 運作原理及觀念
[Data Step][SAS] II. 如果要做 T, T-1 相關的計算要如何做 ?