sas 中 merge by 的用法就不赘述了,需要的可以去自行查询;
这里主要讲述几种常见的merge by 在DB2中如何翻译
1,MERGE BY TAB1 TAB2 TAB3... ;
BY ID;
2,MERGE BY TAB1(IN = A) TAB2 ;
IF A = 1;
BY ID;
3,MERGE BY TAB1(IN = A) TAB2(IN = B);
BY ID;
IF A AND B THEN OUTPUT;
开始:
TAB1、TAB2、TAB3 的表结构如下:
TAB1 :
ID | NAME | SEX | AGE |
1001 | TOM | F | 25 |
1002 | LYLI | M | 21 |
1003 | LISA | M | 20 |
1005 | ANNA | M | 26 |
TAB2:
ID | LANGUAGE | SCORE |
1001 | CHN | 85 |
1001 | ENG | 76 |
1002 | CHN | 89 |
1004 | ENG | 90 |
TAB3:
ID | LANGUAGE1 | SCORE1 |
1001 | CHN1 | 185 |
1002 | ENG1 | 176 |
1003 | CHN1 | 189 |
1005 | ENG1 | 190 |
第一种情况:
SAS代码:
data TABLEA;
merge TAB1 TAB2 TAB3 ;
by ID ;
run;
结果如下:
ID | NAME | SEX | AGE | LANGUAGE | SCORE | LANGUAGE1 | SCORE1 |
1001 | TOM | F | 25 | ENG | 76 | CHN1 | 185 |
1001 | TOM | F | 25 | CHN | 85 | CHN1 | 185 |
1002 | LYLI | M | 21 | CHN | 89 | ENG1 | 176 |
1003 | LISA | M | 20 | CHN1 | 189 | ||
1004 | ENG | 90 | |||||
1005 | ANNA | M | 26 | ENG1 | 190 |
通过观察SAS 的结果可以看出这里似乎可以用多个FULL JOIN 进行关联
SELECT NVL(A.ID,B.ID) AS ID,
NAME,
SEX,
AGE,
LANGUAGE,
SCORE,
LANGUAGE1,
SCORE1
FROM (
SELECT NVL(A.ID,B.ID) AS ID,
NAME,
SEX,
AGE,
LANGUAGE,
SCORE
FROM TAB1 A
FULL JOIN ( SELECT ID,LANGUAGE,SCORE
FROM TAB2 ) B
ON A.ID = B.ID
) A
FULL JOIN
(SELECT ID,LANGUAGE1,SCORE1
FROM TAB3 ) B
ON A.ID = B.ID
结果如下:
ID | NAME | SEX | AGE | LANGUAGE | SCORE | LANGUAGE1 | SCORE1 |
1001 | TOM | F | 25 | ENG | 76 | CHN1 | 185 |
1001 | TOM | F | 25 | CHN | 85 | CHN1 | 185 |
1002 | LYLI | M | 21 | CHN | 89 | ENG1 | 176 |
1003 | LISA | M | 20 | CHN1 | 189 | ||
1004 | ENG | 90 | |||||
1005 | ANNA | M | 26 | ENG1 | 190 |
结论:目前来看,这种情况可以用FULL JOIN来关联,其他情况还需要多测试。
第二种情况:
SAS代码:
data TABLEB;
merge TAB1 (in = a) TAB2;
if a = 1;
by id;
run;
结果如下:
ID | NAME | SEX | AGE | LANGUAGE | SCORE |
1001 | TOM | F | 25 | CHN | 85 |
1001 | TOM | F | 25 | ENG | 76 |
1002 | LYLI | M | 21 | CHN | 89 |
1003 | LISA | M | 20 | ||
1005 | ANNA | M | 26 |
结论:目前来看,这种情况可以用 LEFT JOIN 来实现,通过BY 的字段来进行关联。
第三种情况:
SAS代码:
data TABLEC;
merge TAB1 (in = a ) TAB2 (in = b );
by ID;
run;
结果如下:
ID | NAME | SEX | AGE | LANGUAGE | SCORE |
1001 | TOM | F | 25 | CHN | 85 |
1001 | TOM | F | 25 | ENG | 76 |
1002 | LYLI | M | 21 | CHN | 89 |
结论:目前来看,这种情况可以用 INNERJOIN 来实现,通过BY 的字段来进行关联。
结束!