需求
給定表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;