需求
给定表A、B:
A
中存在非主键列X
;A
中有多行记录、X
值相同;- 1中
X
值可在B
中找到多行记录,但连表时A只需一条B记录; - 1中不同行、在
B
中选择可能不同记录(可能有多种条件),即多行过滤
+-----+-----+
| AID | X |
+-----+-----+
| a1 | x1 |
+-----+-----+
| a2 | x1 |
+-----+-----+
+-----+-----+
| BID | X |
+-----+-----+
| b1 | x1 |
+-----+-----+
| b2 | x1 |
+-----+-----+
| b3 | x2 |
+-----+-----+
期望连表查询结果:
+-----+-----+-----+
| AID | X | BID |
+-----+-----+-----+
| a1 | x1 | b1 |
+-----+-----+-----+
| a2 | x1 | b2 |
+-----+-----+-----+
解决思路
ODPS提供了UDF、WINDOW函数等:
- UDF只能解决单行数据问题、不能解决一对多问题
- 窗口函数只能解决单表问题。
- UDJ方案还未研究。
目前使用了SQL方案:
SELECT AID,
if(tmp.k = 0, tmp.ks[0], tmp.k) as BID
FROM A a
LEFT JOIN (
select x, SUM(IF(任意扩展条件, BID, 0)) k, collect_set(BID) as ks
from B b group by x
) tmp on a.x = tmp.x;