如何从具有可变列的多个表创建表(不能使用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
答案 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);