繁体   English   中英

将两张表中的几列合并为前一张表中ID的一行

[英]Merge several columns from two tables into one rows for id in the former table each

如果有表A和表B。它们的结构如下:

A :

id

1
2

B:

col_1    col_2

m         q
n         w

如何获得SQL下方的C结果?

id     col_1   col_2    col_1  col_2 

 1       m     q        n      w
 2       m     q        n      w

对于表B中的每个数据,它们都与表A中的ID相关联。将两个表串联到表C中之后。一旦表C中的ID更改(属于表A中的ID),表C中的对应行更改。 因此,为了获得最终的表C,应该进行一些计算以获取表C中的每个数据(col_1,col_2,col_1 col_2)

据我了解,您想从表B中获取所有行,并将其与表A中的ID关联为列。

我认为仅查询是不可能的(不知道某个过程是否可以解决它),但是我有一种方法可能会有所帮助(我在MySQL上进行了测试)。

SELECT 
  `a`.`id`, 
  GROUP_CONCAT(`b`.`key`) AS `keys`, 
  GROUP_CONCAT(`b`.`value`) AS `values` 
FROM `a`, `b` 
GROUP BY `a`.`id` ASC;

结果,我们有:

---- ------ --------
| id | keys | values |
 ---- ------ --------
|  1 | m,n  | 3,4    |
|  2 | m,n  | 3,4    |
 ---- ------ --------

列键中的第一个键和列值中的第一个值引用表b的第一行。 第二个引用第二行,依此类推。 这样,您只需要在分隔符“,”上加上一些服务器端代码即可。

我搜索了从Postgres到MySQL GROUP_CONCAT的匹配命令,发现STRING_AGG可以完成相同的工作。

希望能帮助到你!

只要您事先知道B中可以出现多少个不同的key (并且没有太多),这应该可以工作:

select A.id, Once.key k1, Once.value v1, Twice.key k2, Twice.value v2
from A,(select * from B where B.key='m') Once,
(select * from B where B.key='n') Twice;

编辑:这是通过上面的查询获得的结果:

| ID | K1 | V1 | K2 | V2 |
--------------------------
|  1 |  m |  3 |  n |  4 |
|  2 |  m |  3 |  n |  4 |

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM