【问题标题】:SQL - merge two database tables into one database tableSQL——将两张数据库表合并为一张数据库表
【发布时间】:2016-01-16 14:33:02
【问题描述】:

我需要创建一个包含 n 行值的视图(或表),这些值取自两个具有相同结构的不同表。例如:

表格国家

id    name        Country
----------------------------
1     Franz       Germany
2     Alberto     Italy
3     Miguel      Spain

表格电子邮件

id    name        Email
----------------------------
1     Franz       franz@gmail.com
2     Alberto     alberto@gmail.com
3     Miguel      miguel@gmail.com

表电话号码

id    name        Phone
----------------------------
1     Franz       111-111-1111
2     Alberto     111-111-1111
3     Miguel      111-111-1111

合并后的数据库必须是这样的:

id    name        Country        Email                 Phone
---------------------------------------------------------------------
1     Franz       Germany        franz@gmail.com       111-111-1111
2     Alberto     Italy          alberto@gmail.com     111-111-1111
3     Miguel      Spain          miguel@gmail.com      111-111-1111

【问题讨论】:

  • 为什么要在所有这些表中复制名称数据?

标签: mysql sql sql-server database sqlite


【解决方案1】:

尝试选择所需的列。您可以从多个表中获取 比如,

SELECT id, name, email, phone FROM table1, table2, table3

【讨论】:

  • 如果没有连接条件,您将得到 3*3*3 行的笛卡尔积。和 id 来自哪个表?列歧义。
【解决方案2】:

你可以这样试试:

Select 
Country.id,
Country.name,
Country.country,
email.Email,
phoneno.phone

FROM

Country
INNER JOIN email ON (Country.id = email.id)  
INNER JOIN phoneno ON (Country.id = phoneno.id) 

【讨论】:

  • 这是否构成一个要查询的新表?抱歉,刚接触 sql,所以不太了解
  • 不,它会获取您想要查看的结果集。它不会在数据库中创建任何新表。
【解决方案3】:

创建表会复制数据;仅当您需要创建数据快照时,这才有意义。 要始终查看数据的当前状态,请使用视图:

CREATE VIEW Merged AS
SELECT c.id,
       c.name,
       c.Country,
       e.Email,
       p.Phone
FROM      Country AS c
LEFT JOIN email   AS e USING (id)
LEFT JOIN phoneno AS p USING (id);

即使缺少某些电子邮件或电话号码,使用 outer join 也会返回行。 如果一个国家行有多个电子邮件或电话号码,您将获得重复的国家数据。

【讨论】:

  • 是的,你的权利......如果你能帮助我将两个表数据复制到一个中,这将对我有很大帮助。
  • 然后编辑问题以显示相关示例数据和所需结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
相关资源
最近更新 更多