A表中每行对应B表中0-2行,查询结果固定2行,没有的为空
你没说数据库类型和版本,我以oracle举例
select a.a,b.b
from (select a.*, 1 od
from test_table_a a
union all
select a.*, 2 od
from test_table_a a) a
left join (select b.*, row_number() over(partition by b.a order by b.b) od
from test_table_b b) b
on a.a = b.a
and a.od = b.od
;
这个开窗函数,有一部分数据库是不支持的。
其实关键点在于,你想得到的记录数是A表的翻倍,但翻倍后,关联条件就不是唯一的,因此要构造一个虚拟的列,让它能和a字段一起定位唯一行。同理,在B表里也要有一个与之相匹配的列,在这里用到了开窗函数产生一个序号
先查出来只有一行的 union 个空的吧
用左连接查询。