MySQL中按行序匹配的无条件Simple join实现方案咨询
按行序匹配的表连接实现方案
现有数据表
表1(t1)
| value |
|---|
| a |
| b |
表2(t2)
| value |
|---|
| c |
| d |
| e |
期望结果
需要实现按行序匹配的无条件Simple join——也就是第一个表的行和第二个表对应顺序的行匹配,最终得到这样的结果:
| value | value |
|---|---|
| a | c |
| b | d |
| NULL | e |
你目前的临时方案
你写的临时SQL语句:
SELECT value, "table1" AS src FROM t1 UNION ALL SELECT value, "table2" AS src FROM t2
执行后得到的结果是:
| value | src |
|---|---|
| a | table1 |
| b | table1 |
| c | table2 |
| d | table2 |
| e | table2 |
能不能靠这个方案实现目标结果?
这个临时方案本身没法直接输出你想要的结果,但可以基于它进一步处理,或者换一种更直接的方式来实现行序匹配:
推荐的直接实现方式
给两个表各自加上行号,然后按行号做右连接(因为表2行数更多),就能精准按行序匹配,没有对应行的位置自动填NULL:
MySQL/PostgreSQL通用写法:
SELECT t1.value, t2.value FROM ( SELECT value, ROW_NUMBER() OVER () AS row_num FROM t1 ) t1 RIGHT JOIN ( SELECT value, ROW_NUMBER() OVER () AS row_num FROM t2 ) t2 ON t1.row_num = t2.row_num;
基于你现有UNION ALL结果的处理方式
如果一定要用你已经写的UNION ALL结果来改,可以用条件聚合的方式:
SELECT MAX(CASE WHEN src = 'table1' THEN value END) AS value, MAX(CASE WHEN src = 'table2' THEN value END) AS value FROM ( SELECT value, src, ROW_NUMBER() OVER (PARTITION BY src ORDER BY (SELECT NULL)) AS row_num FROM ( SELECT value, "table1" AS src FROM t1 UNION ALL SELECT value, "table2" AS src FROM t2 ) temp ) grouped GROUP BY row_num;
不过这种写法绕了一圈,不如直接给两个表加行号再连接来得简洁高效。
内容的提问来源于stack exchange,提问作者Sergey_Z
相关产品推荐
相关产品推荐

