1

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

A :

id

1
2

乙:

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)

4

2 回答 2

1

据我了解,您希望从表 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;

结果我们有:

---- ------ --------
| 编号 | 钥匙 | 价值观 |
 ---- ------ --------
| 1 | m,n | 3,4 |
| 2 | m,n | 3,4 |
 ---- ------ --------

列键中的第一个键和列值中的第一个值是指表 b 的第一行。第二个是指第二行,依此类推。这样,您只需要使用一些服务器端代码在分隔符 ',' 上进行拆分。

我搜索了从 Postgres 到 MySQL GROUP_CONCAT 的匹配命令,发现STRING_AGG可能做同样的工作。

希望能帮助到你!

于 2013-03-20T15:59:33.683 回答
0

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

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 |
于 2013-03-20T15:50:13.210 回答