如何组合具有不同列名的两个表

时间:2014-04-22 11:23:32

标签: mysql sql mysql-variables

我有两张桌子说A和B.

表A:

+------------+
| manager_id |
+------------+
|        100 |
|        102 |
|        103 |
|        124 |
|        149 |
|        101 |
|        201 |
|        205 |
+------------+

表:乙

+------------+
| first_name |
+------------+
| Steven     |
| Lex        |
| Alexander  |
| Kevin      |
| Eleni      |
| Neena      |
| Michael    |
| Shelley    |
+------------+

我希望将两个表结合起来。输出表应该看起来像..

表a的第1行应与表b的第1行组合。 表a的第2行应该与表b的第2行结合,依此类推......

输出:

+------------+-------------+
| manager_id | first_name  |
+------------+-------------+
|        100 |      steven |
|        101 |        lex  |
|        102 |   alexander |
|        103 |       kevin |
|        124 |       eleni |
|        149 |       neena |
|        201 |     michael |
|        205 |     shelley |
+------------+-------------+

我尝试了不同的连接和联合但没有得到所需的输出。提前谢谢

注意:这些表是查询的结果,因此无法添加任何额外的列。

1 个答案:

答案 0 :(得分:4)

这是一个非常糟糕的主意,原因很简单:SQL表(包括MySQL表)没有排序。因此,无法保证select *的结果将按任何特定顺序排列。没有第一行,第二行等等 - 至少没有保证。

也就是说,有时你会遇到没有自动递增的ID加载的多个表,你可以解决它。我强烈建议您事后验证结果,因为无法保证。您需要为此使用变量:

select a.rn, a.manager_id, b.first_name
from (select @rn_a := @rn_a + 1 as rn, a.*
      from a cross join
           (select @rn_a := 0) const
     ) a join
     (select @rn_b := @rn_b + 1 as rn, b.*
      from b cross join
           (select @rn_b := 0) const
     ) b
     on a.rn = b.rn;

我想补充一点,这种方法在大多数数据库中都不起作用,这些数据库支持简单选择的并行处理。例如,Oracle和SQL Server肯定不会以插入顺序返回大型表(除非你摆弄了一堆选项)。 MySQL 似乎以插入顺序返回表(假设没有中间更新或删除),尽管不能保证这样做。