MaxCompute(ODPS)一对多连表时实现多行过滤(同样适用于MySQL)

需求

给定表A、B:

  1. A中存在非主键列XA中有多行记录、X值相同;
  2. 1中X值可在B中找到多行记录,但连表时A只需一条B记录;
  3. 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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章