2

我如何在 mysql 中加入3 个或更多表,如下所示?

  • 每个表的每一列都有一列(ID除外)
  • ID 字段值都进入新表中的相同 ID 字段
  • 添加了一个附加列table,其值是源表名称
  • 添加了一个自动递增的newID字段
  • 每一行只有一个表,不相关的字段有空值
  • 总行数等于所有表中记录的总和

只有两个表的示例:

TableA:                  TableB          
ID   |   fieldA          ID   |   fieldB 
-----------------       -----------------
  1  |   valueA1           1  |   valueB1
  2  |   valueA2           2  |   valueB2


ResultTable:
newID  | ID  |  table  | fieldA  |  fieldB
---------------------------------------------
   1   |  1  |  TableA | valueA1 |  
   2   |  2  |  TableA | valueA2 |  
   3   |  1  |  TableB |         |  valueB1
   4   |  2  |  TableB |         |  valueB2

我知道这可能听起来有点奇怪!我将尝试使用这个批量插入脚本将来自各种表的记录的节点批量插入到neojs图形数据库中。考虑到我几乎不知道我在这两个数据库中做什么,这可能很有趣;-)。

4

3 回答 3

3

试试这个,

SELECT  @rownum := @rownum + 1 AS NewID,
        a.*
FROM
    (
        SELECT  ID, fieldA, '' AS fieldB
        FROM    tableA
        UNION ALL
        SELECT  ID, '' AS fieldA, fieldB
        FROM    tableB
    ) a, (SELECT @rownum:=0) r

SQLFiddle 演示

  • 创建新表

这是建议的架构

CREATE TABLE Newtable
(
    NewID INT AUTO_INCREMENT,
    ID INT NOT NULL,
    FieldA VARCHAR(30),
    FieldB Varchar(30),
    CONSTRAINT tb_pk PRIMARY KEY (NewID)
)
  • 然后插入您的值,

这是使用INSERT INTO...SELECT语句的查询

INSERT INTO NewTable (ID, fieldA, fieldB)
SELECT  ID, fieldA, NULL AS fieldB
FROM    tableA
UNION ALL
SELECT  ID, NULL AS fieldA, fieldB
FROM    tableB
于 2012-09-20T05:30:20.727 回答
1
  1. 创建具有自动递增 newID 的表
  2. 添加所有允许空值的可能列。
  3. 将 TableA 中的值插入其中,然后将 TableB 中的值插入如下:

 

INSERT INTO table
(ID, `table`, fieldA)
SELECT ID, 'TableA', fieldA FROM TableA

INSERT INTO table
(ID, `table`, fieldB)
SELECT ID, 'TableB', fieldB FROM TableB
于 2012-09-20T05:32:20.710 回答
0

使用 UNION 选择一个结果集中的所有行,INSERT INTO 用于插入新表。您还可以在 sql server 中使用 ROW_NUMBER() 获取新 ID

SELECT ID, COL1, NULL, NULL FROM Table1
UNION
SELECT ID, NULL, COL2, NULL FROM Table2
UNION
SELECT ID, NULL, NULL, COL3 FROM Table3

将上述结果选择到临时表中。使用行号更新新 ID

SELECT ID, ... , ROW_NUMBER() OVER(ORDER BY ID) AS NewID FROM #TempTable
于 2012-09-20T05:39:42.197 回答