【问题标题】:MySQL - How to create a new table that is a join on primary key of two existing tablesMySQL - 如何创建一个新表,该表是两个现有表的主键的连接
【发布时间】:2011-01-07 21:30:27
【问题描述】:

我有两个现有的表,除了主 ID(varchar,不是int)外,它们具有不同的字段。我想创建第三个表,它本质上是这两个表的合并,这样对于给定的主键,我将所有字段都放在一个表中。

如何做到这一点?

【问题讨论】:

  • 您确定要一个表(包含表中当前数据的快照,并且不会反映未来的变化)吗?您不是在寻找视图(始终查看表中的当前数据)吗?
  • 嗨 Bandi-T - 这是一个好主意,实际上考虑一下也许我不需要合并它们。但是,数据是相当静态的,只会每月左右批量更新。
  • 好吧,如果你选择一个表,DBMS 只计算一次,不会跟随源数据的变化。如果您选择一个视图,DBMS 会在每次有人查询该视图时进行计算,但它始终包含新数据。如果您必须对这些合并数据执行许多查询(我猜您查询的频率会比更新发生的频率高),那么选择使用表可能非常值得。
  • @Bandi-T - 是的,它的查询频率要比更新频率高得多。但是数据集很大,所以可能会为自己节省一些痛苦并使用视图模型
  • 是的,我会感觉更好 - 请参阅下面的 TMN 答案。当然,表格的宽度和高度也会影响到这一点,以及您将有什么样的查询。然后我们甚至没有开始考虑添加索引来加快查询速度。

标签: mysql join merge create-table


【解决方案1】:

对于 MS SQL 使用这个

SELECT * INTO result 
FROM  table1
INNER JOIN table2
ON table1.id = table2.id

【讨论】:

    【解决方案2】:
    CREATE TABLE result AS 
      (SELECT first.*, 
              second.f1, 
              second.f2, 
              second.f3 
       FROM   first 
              INNER JOIN second 
                      ON first.id = second.id);
    

    要获得视图,请执行相同操作,只是将“TABLE”替换为“VIEW”。如果您使用表而不是视图,请确保添加主键,因为默认情况下不会添加。

    【讨论】:

      【解决方案3】:

      为什么要创建一个新表?为什么不在需要数据时执行查询?如果您只是在主键上连接两个表,那么您的大部分数据访问时间将用于将数据编组回您的应用程序。在加入表格之前,您不会节省太多时间,而且会占用大量空间。另外,您正在瞄准您的大脚趾,只是在等待第一次更新源表时忘记运行更新脚本以将更改复制到连接表。重复数据是邪恶,但有时它是必要的。这听起来不像是那个时代之一。

      【讨论】:

        【解决方案4】:

        如果您确定对于给定的主 ID,两个表中都只有一行,那么这应该可以:

        SELECT
            tablea.field1, tablea.field2, tablea.field3, ... tablea.fieldn, <---- field list
            tableb.field1, tableb.field2, tableb.field3, ... tableb.fieldm  <---- field list
        FROM
            tablea, tableb
        WHERE
            tablea.primaryID = tableb.primaryID
        

        如果您实际上并不需要 tablea 和 tableb 的主 ID 字段,您可能希望从字段列表中省略它们(在此查询中,由于 tablea.primaryID = tableb.primaryID 条件,两者将包含相同的值)。

        VIEW 的语法也相对相似。

        【讨论】:

        • 是的,可以肯定的是,每个表中给定的 PID 只有一行。 PID 设置为 PRIMARY KEY - 如果存在欺骗,MySQL 可能会在导入时出错?
        • @Richard:是的,会的。但是,为了使上述查询只提供一次所有行,您还必须确保两个表中的行(记录)可以精确地 1:1 匹配。如果您在一个表中有一个主键 3,但在另一个表中没有主键 3,则结果中将没有带有 3 的行,因为在其他表。
        猜你喜欢
        • 2012-11-08
        • 2021-04-10
        • 2014-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-08
        • 1970-01-01
        相关资源
        最近更新 更多