如何从多个表中选择创建表?

时间:2014-08-28 10:57:10

标签: mysql

如何从具有可变列的多个表创建表(不能使用union)?

mysql> select * from a;
+------+------+
| id   | name |
+------+------+
| 1    | Ruby |
+------+------+

mysql> select * from b;
+------+------+
| pid  | name |
+------+------+
| 1    | Java |
| 1    | C++  |
+------+------+

我想要的......

+------+------+------+------+
| id   | name | pid  | bname|
+------+------+------+------+
| 1    | Ruby |      |      |
|      |      | 1    | C++  |
|      |      | 1    | Java |
+------+------+------+------+

我尝试了什么。

mysql> create table t as select * from a; # worked fine
mysql> alter table t as select pid, name as bname from b; #didn't work

4 个答案:

答案 0 :(得分:1)

使用union没问题,您只需选择null s作为表格中没有的列:

CREATE TABLE t AS
SELECT id, name, null AS pid, null AS bname
FROM   a
UNION ALL
SELECT null, null, pid, bname
FROM   b

答案 1 :(得分:1)

创建包含所有四列的新表。然后

INSERT INTO t (id, name) SELECT * FROM a;
INSERT INTO t (pid, bname) SELECT * FROM b;

第一行会将a中的所有内容放在那里,将其他两个字段保留为NULL;第二个将从b执行相应的操作。您可以在一个CREATE / UNION声明中完成整个操作,但如果这是一次性操作,那么如果您执行此操作,可能更容易理解您正在执行的操作它就像这样。

答案 2 :(得分:1)

你可以用这种相当神秘的方式做到这一点:

select a.*, b.*
from a left join
     b
     on 1 = 0
union all
select a.*, b.*
from b left join
     a
     on 1 = 0;

这是在MySQL中实现的一种方式:

select a.*, b.*
from a full outer join
     b
     on 1 = 0;

但是,它需要union。如果您想避开union

,可以分两步完成
create table ab as
    select a.*, b.*
    from a left join
         b
         on 1 = 0;

insert into ab
    select a.*, b.*
    from b left join
         a
         on 1 = 0;

答案 3 :(得分:0)

您可以以此为例。 通过将两个表(学生证,姓名)和(学生证,出生日期)连接起来,创建一个新表(名称,出生日期)。

创建第一个表:

create table stu1(student_id char(5) primary key,name varchar(45))ENGINE=innodb;

创建第二张表:

create table stu2(student_id char(5) primary key,dob date)ENGINE=innodb;

创建第三个表(通过连接两个表):

create table stu3 AS(select stu1.name,stu2.dob from stu1,stu2  
                                      where stu1.student_id=stu2.student_id);