组合3个或更多表,故意没有连接条件

时间:2012-09-20 05:26:12

标签: mysql sql

如何在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

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

3 个答案:

答案 0 :(得分: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 Demo

<击>

  • 创建新表

这是建议的架构

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

答案 1 :(得分:1)

  1. 使用自动增量newID创建表
  2. 添加允许空值的所有可能列。
  3. 将TableA中的值插入其中,然后使用类似:
  4. 的表格插入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
    

答案 2 :(得分: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