MySQL查询基于两个表创建一个新表

时间:2016-12-28 09:34:33

标签: mysql sql phpmyadmin create-table

primary_table:

name_column | description_column
--------------------------------
John        | asb
Marta       | oikjew89
Steve       | fr23

secondary_table:

name_column | lastname_column  | dob_column
-------------------------------------------
Marta       | Doe              | 1970-09-02
Steve       | Dobson           | 1968-04-01
Marta       | Simpson          | 1952-10-08
Michael     | Stone            | 1963-02-22

查询执行的结果是 result_table表,其中包含:

name_column | description_column| lastname_column  | dob_column 
---------------------------------------------------------------
John        | asb               |   NULL           |   NULL
Marta       | oikjew89          | Doe              | 1970-09-02
Marta       | oikjew89          | Simpson          | 1952-10-08
Steve       | fr23              | Dobson           | 1968-04-01

表示 result_table 类似于 primary_table ,但更宽,并且行数相等或更多。它可能会获得更多的行,因为name_column值可能在secondary_table中出现超过1次(例如-Marta)。

如果在primary_table中没有满足来自secondary_table的name_column值,则secondary_table中的

name_column行不会影响任何内容(例如 - Steve)。

根据选择,应创建result_table。

只要两个表都有大量数据(数千行),name_column就会在两个表中编制索引,因此查询执行不会花费数小时。 名字和姓氏只是一个例子。实际数据与人们完全不同。

谢谢。

4 个答案:

答案 0 :(得分:2)

以下是基于select语句创建result_table的方法:

CREATE TABLE result_table AS
SELECT p.name_column, p.description_column, s.lastname_column, s.dob_column
FROM primary_table p
LEFT JOIN secondary_table s ON p.name_column = s.name_column;

随后执行SELECT * FROM result_table ORDER BY name_column;将产生以下输出:

+-------------+--------------------+-----------------+------------+
| name_column | description_column | lastname_column | dob_column |
+-------------+--------------------+-----------------+------------+
| John        | asb                | NULL            | NULL       |
| Marta       | oikjew89           | Doe             | 1970-09-02 |
| Marta       | oikjew89           | Simpson         | 1952-10-08 |
| Steve       | fr23               | Dobson          | 1968-04-01 |
+-------------+--------------------+-----------------+------------+

答案 1 :(得分:0)

你应该看看LEFT OUTER JOIN概念。它将为您提供主表中的所有行以及来自辅助表的任何匹配行。当没有匹配的数据时,将报告引用辅助表的查询列的NULL(如果辅助表中没有条目,则lastname_column将为空。)

此外,基于上述查询的结果,新表创建应该很简单

根据您的示例,查询应该看起来像

select t1.name_column, t1.description, t2.lastname_column, t2.dob_column
from primarytable t1
left outer join secondarytable t2 on t1.name_column = t2.name_column

答案 2 :(得分:0)

如果您打算创建新表,那么您需要读取两个表的整个模式并使用模式重新创建新表并从这两个表中插入这些记录。

有多简单的方法只是查询它而实际创建更简单的新表。

SELECT 
pt.name_column,
pt.description_column,
st.lastname_column,
st.dob_column
FROM primary_table AS pt 
LEFT OUTER JOIN secondary_table AS st 
ON pt.column_name = st.column_name 

答案 3 :(得分:0)

您可以通过在查询中使用左连接来实现所需的结果...

SELECT A.name_column,A.description_column,B.lasname_column,B.dob_column
from Primary_table A
Left Join Secondary_table B
ON A.name_column = B.name_column