JOIN 后再分组取第一条

【问题】

sql 语句比如有俩个表,
A 表有 Id,Name
B 表有 Id,URL,CaseId 对应 A 表的 Id,B 表是多条数据对 A 表单数据
比如 A 表数据如下

1                 张三  
2                 李四  
3                 王五  

B 表如下

1                 1.png       1   
2                 2.png       1   
3                 3.png       2   

但是我要查出 AB 表数据不重复,要查为 A 表的 Id,Name 和 B 表 URL 查出如下,如何写

1                张三         1.png   
2               李四          3.png   
3               王五          NULL

【回答】

mysql 实现这个可以两表先关联再按 a.id 分组取第一条,也可以先按 b.caseid 分组取每组第一条后与 a 表关联。可以这样写(mysql 比较特别,group by 后选出数据即为分组中的第一条):

select a.id,a.name,b.url from a left join b on a.id=b.caseid group by a.id

但这种写法只有 mysql 支持,不利于扩展到其他数据库上(其它支持窗口函数的数据库可以给成员做一个组内序号再取出),需要较通用的计算时,可以试试 SPL,在集算器中这个计算可以这样写:



A

1

$select a.id ID,a.name NAME,b.url URL from a left join b on a.id=b.caseid

2

=A1.group@1(ID)


两表关联后,通过 A.group() 的 @1 选项直接取得每个分组中第一个成员,而且集算器提供 JDBC 接口,可以像数据库一样嵌入到应用程序中,用起来很简单。