首页 > 解决方案 > 合并多个具有相同 ID 的表

问题描述

我正在尝试合并几个表。目标是最终将它们全部放在一张桌子上,但按 ID 排序。因此,如果我在某些表之间有匹配的 ID,它会根据 ID 合并为一行。

所以 ID 的列名是:“ID(table1), Identity(table2), CatalogNum(table3)”

这是一个例子,

table1: 
**ID**   | Name  | Price | Date | ....
 000212     Rod     200    NULL    etc
          ...... 

table2: 
Descr        | **Identitiy** | amount | ...
Silver rod        000212         3       NULL
               ......

table3: 
Type   | Price | Condition | **CatalogNum** | .....
Metal     NULL      8         000212         etc
Wood      300       1         000313        etc
              .....

所以最终结果应该是这样的:

 **ID**  |  Name  |  Price  | Date |  Descr      | amount | Type | Condition | .... | ... | .....
  000212    Rod       200     NULL   Silver rod      3      Metal      8       etc    NULL   etc
  000313    NULL      300     NULL    NULL          NULL    Wood       1       NULL   NULL   etc

标签: sqlsql-server

解决方案


由于各种表中可能出现的所有值都没有单一来源ID,因此您必须构建一个,然后使用它来连接所有其他表以获取您感兴趣的列。

不过,出于此处的目的,我撤回了所有表中的所有列。

WITH IdList AS (
  SELECT 
    ID AS MasterId
  FROM table1
  UNION
  SELECT
    Identitiy
  FROM table2
  UNION
  SELECT
    CatalogNum
  FROM table3
)
SELECT
  i.MasterID,
  t1.*,
  t2.*,
  t3.*
FROM IdList as i
LEFT JOIN table1 as t1 ON t1.ID = i.MasterID
LEFT JOIN table2 as t2 ON t2.Identitiy = i.MasterID
LEFT JOIN table3 as t3 ON t3.CatalogNum = i.MasterID;

结果:

+----------+--------+--------+--------+--------+------------+-----------+--------+-------+--------+-----------+------------+
| MasterID |   ID   |  Name  | Price  |  Date  |   Descr    | Identitiy | amount | Type  | Price  | Condition | CatalogNum |
+----------+--------+--------+--------+--------+------------+-----------+--------+-------+--------+-----------+------------+
|   000212 | 000212 | Rod    | 200    | (null) | Silver rod | 000212    | 3      | Metal | (null) |         8 |     000212 |
|   000313 | (null) | (null) | (null) | (null) | (null)     | (null)    | (null) | Wood  | 300    |         1 |     000313 |
+----------+--------+--------+--------+--------+------------+-----------+--------+-------+--------+-----------+------------+

SQL Fiddle 演示

编辑:您的问题指出您希望将数据放在一个表中,“ , but sorted by ID.” SQL 表不能那样工作。根据定义,它们是无序集。您可以通过在查询中使用ORDER BY子句来对它们施加顺序。SELECT因此,我在上面的查询中根本没有努力创建任何类型的“订单”。


推荐阅读