sql - MS Access VBA/SQL - 从 3 个表中选择不同的匹配记录并更新单个列
问题描述
我已经为此苦苦挣扎了几天,但我已经束手无策了。
我有 3 个需要比较的数据集 - 第一个带有 Part_ID 列表的表,然后是其他两个可能/可能不包含相同 ID 的数据集(“dataTables”)(对应的列存在于这两个表中,但值可能不是)。
我需要查看表 1 中的每个值(我们称之为 keyTable),查看它是否存在于任一数据表中,然后如果匹配,则从数据表中的列中获取值,称为“定义”并粘贴它位于与 Part_ID 位于同一行的 keyTable 中名为“def_exists”的列中。
我尝试了各种 SQL 查询,使用 DISTINCT 和嵌套的 SELECT 函数,但没有任何成功。我能够将 keyTable 中的 Part_ID 字段与 dataTables 之一匹配并正确附加“定义”值,但我无法删除重复项,因为 Part_ID 和定义之间存在一对多关系dataTable,我最终得到了超过一百万个重复项(keyTable 是 ~16k 记录,Query 返回 ~1.6m)。尝试一次查询所有三个表最终得到 1.25 亿多条记录。
我希望我正在尝试实现的一个示例将使这更容易理解,因为它可能听起来有点模糊或令人困惑。
键表
ID Part_ID Random_Info Def_Exists_1 Def_Exists_2
1 ABC123 Bla
2 BCD234 Bla
3 CDE345 Bla
4 DEF456 Bla
5 EFG567 Bla
6 FGH678 Bla
数据表1
ID Part_ID Definition
1 ABC123 A1
2 ABC123 A2
3 ABC123 A3
4 ABC123 A4
5 BCD234 B1
7 BCD234 B2
8 BCD234 B3
9 CDE345 C1
10 CDE345 C2
数据表2
ID Part_ID Definition
1 DEF456 D1
2 DEF456 D2
3 DEF456 D3
4 EFG567 E1
5 EFG567 E2
6 EFG567 E3
7 FGH678 F1
8 FGH678 F2
9 FGH678 F3
所需的输出键表
ID Part_ID Random_Info Def_Exists_1 Def_Exists_2
1 ABC123 Bla A1
2 BCD234 Bla B1
3 CDE345 Bla C1
4 DEF456 Bla D1
5 EFG567 Bla E1
6 FGH678 Bla F1
我希望示例表使它更清楚一点。如果有多个匹配项,即 DEF456 的 D1、D2、D3,我只想显示第一条记录,或者甚至只是纯文本中的“是”。
我还需要在正确的列中显示“是”或定义,即 dataTable1 = Def_Exists_1,dataTable2 = Def_Exists_2。
任何帮助都会很棒,我觉得我已经在网上搜索了解决方案,但没有人知道 - 无论是那个还是我的 SQL 仍然生锈(这很可能)。
解决方案
我认为你可以用子查询来做到这一点
select kt.*,
(select top (1) as definition
from datatable1 dt1
where dt1.part_id = kt.part_id
) as definition_1,
(select top (1) as definition
from datatable1 dt2
where dt2.part_id = kt.part_id
) as definition_2
from keytable as kt;
请注意,这将返回任意匹配的定义。order by
您可以通过在子查询中包含一个来指定哪个定义(例如第一个定义),例如order by id
.
推荐阅读
- android - 安装 Android stock 和 Lineage 后调整与物理存储大小不匹配的数据分区大小
- ember.js - 循环条件渲染
- python - 如何使用 numpy.meshgrid 绘制函数
- android - 我正在尝试在我的应用程序中集成 Agora 语音通话,但出现 java.lang.UnsatisfiedLinkError
- java - 如何从javafx中的嵌套列表制作tableview?
- c# - LINQ 从字典中获取第一项不为空或为空
- gitlab - GitLab CI 部署管道中的手动批准
- sql - 如何从 Oracle SQL 中删除具有完全相同数据的多行
- android - 将应用程序从 Play 商店分发给内部测试人员
- java - 从java项目中提取所有字符串文字