sql - 合并多个具有相同 ID 的表
问题描述
我正在尝试合并几个表。目标是最终将它们全部放在一张桌子上,但按 ID 排序。因此,如果我在某些表之间有匹配的 ID,它会根据 ID 合并为一行。
- 有两个以上的表(我目前有三个:table1、table2、table3,但我计划将来添加更多)
- 一些表没有相同的列或列数。
- 某些表的 ID 列名称不同,table1 具有“ID”,table2 将其命名为“identity”,依此类推...
- 我尽量不在代码中包含每个表中的所有可用列,因为每个可用表中都有大量列,我假设在查询中添加和命名它们中的每一个会很累。但是,我确实知道每个表中 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
解决方案
由于各种表中可能出现的所有值都没有单一来源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 |
+----------+--------+--------+--------+--------+------------+-----------+--------+-------+--------+-----------+------------+
编辑:您的问题指出您希望将数据放在一个表中,“ , but sorted by ID.
” SQL 表不能那样工作。根据定义,它们是无序集。您可以通过在查询中使用ORDER BY
子句来对它们施加顺序。SELECT
因此,我在上面的查询中根本没有努力创建任何类型的“订单”。
推荐阅读
- javascript - 为什么 Chrome 中的表格截断而不是 Internet Explorer?
- signals - VHDL,错误信息;有多个驱动程序
- flutter - 动态列表视图构建器颤动
- node.js - 启用将 websocket 连接到角度服务器
- c# - 从 Web api 中的 JWT Auth Token 访问声明数据
- c++ - 为什么这个 C++ 布尔值返回 false
- tensorflow - Tensorflow:用每行中给定数量的元素重塑一维张量
- python - 获取静态文件的 'GET /static/css/base.css HTTP/1.1" 404 1795' 错误
- macos - 在osx中的多个监视器之间切换光标聚焦
- image - 如何在 shopify 中将特定产品图像设置为备用/悬停图像?