sql - 如何在右表上仅使用 1 行(前 1 行)使用多个 id 进行多个左连接
问题描述
我在多个 ID 上做多个左连接。我试图只匹配右表中的 1 个结果,但不确定当连接在多个 ID 上时如何编写嵌套选择。
即使在多个 ID 上进行连接(预期),最后 2 个左连接也返回超过 1 行,但是我只对匹配右表中结果的一个(前 1 个)感兴趣。
我已经查看了有关左连接的其他帖子,但没有一个包含使用多个 ID 连接。
基本上我正在尝试从 Operation Table (Left Table) 获取操作列表。每个操作都有一个标识符,其中包含类型、基本 ID、批次 ID、拆分 ID、子 ID 和序列号,这些标识符会导致唯一的操作。提到的所有表格都有这些列。
但是,“要求”表“R”对于每个唯一操作可能有超过 1 行,我只需要其中的 1 个要求。“Operation_Audit”表“OA”也是如此。
为了便于阅读,我只在 select 下为每个表放置了 1 列。
Select
O.SETUP_HRS As [Setup Time], O.RUN_HRS As [Run Time],
OS.RESOURCE_ID As [Shop Resource],
WO.PART_ID As [Part ID / Assy],
P.DESCRIPTION As [Part / Assy Description],
WOV.DESCRIPTION As Description,
R.CLOSE_DATE As [Req Issue Date],
OA.RESULT_DETAIL As Reason
From OPERATION As O
Inner Join OPERATION_SCHED OS On
O.WORKORDER_TYPE = OS.WORKORDER_TYPE And
O.WORKORDER_BASE_ID = OS.WORKORDER_BASE_ID And
O.WORKORDER_LOT_ID = OS.WORKORDER_LOT_ID And
O.WORKORDER_SPLIT_ID = OS.WORKORDER_SPLIT_ID And
O.WORKORDER_SUB_ID = OS.WORKORDER_SUB_ID And
O.SEQUENCE_NO = OS.SEQUENCE_NO
Inner Join WORK_ORDER WO On
O.WORKORDER_TYPE = WO.[TYPE] And
O.WORKORDER_BASE_ID = WO.BASE_ID And
O.WORKORDER_LOT_ID = WO.LOT_ID And
O.WORKORDER_SPLIT_ID = WO.SPLIT_ID
Left Outer Join PART P On
P.ID = WO.PART_ID
Inner Join CR_WO_PART WOV On
O.WORKORDER_TYPE = WOV.[TYPE] And
O.WORKORDER_BASE_ID = WOV.BASE_ID And
O.WORKORDER_LOT_ID = WOV.LOT_ID And
O.WORKORDER_SPLIT_ID = WOV.SPLIT_ID And
O.WORKORDER_SUB_ID = WOV.SUB_ID
Left Outer Join REQUIREMENT R On
O.WORKORDER_TYPE = R.WORKORDER_TYPE And
O.WORKORDER_BASE_ID = R.WORKORDER_BASE_ID And
O.WORKORDER_LOT_ID = R.WORKORDER_LOT_ID And
O.WORKORDER_SPLIT_ID = R.WORKORDER_SPLIT_ID And
O.SEQUENCE_NO = R.OPERATION_SEQ_NO And
O.WORKORDER_SUB_ID = R.WORKORDER_SUB_ID
Left Outer Join OPERATION_AUDIT OA On
O.WORKORDER_TYPE = OA.WORKORDER_TYPE And
O.WORKORDER_BASE_ID = OA.WORKORDER_BASE_ID And
O.WORKORDER_LOT_ID = OA.WORKORDER_LOT_ID And
O.WORKORDER_SPLIT_ID = OA.WORKORDER_SPLIT_ID And
O.WORKORDER_SUB_ID = OA.WORKORDER_SUB_ID And
O.SEQUENCE_NO = OA.SEQUENCE_NO And
OA.RESULT = 'M'
Where
O.COMPLETED_QTY <= O.CALC_END_QTY And
WO.SUB_ID = '0' And
O.WORKORDER_TYPE = 'W' And
OS.SCHEDULE_ID = 'STANDARD' And
FilterCriteria = @FilterCriteria
解决方案
我将创建查询,从而为表 R 和 OA 中的每个唯一操作返回所需的一行。然后将这些查询设置为公用表表达式 (CTE)。然后在上面进行原始查询(左侧足够好,不需要左侧外部),但加入单个记录 CTE 而不是 R 和 OA。
推荐阅读
- javascript - 如何访问和打印 JavaScript 对象属性值?
- sql - 如何在 Inno Setup 中正确检查我的机器上安装了哪个 MS SQL Server 版本?
- java - 无法在项目 fhirql 上执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile):致命错误编译
- javascript - 用于在最小化或最大化菜单之间转换的按钮,但 :hover 会阻止菜单最小化
- python - Python:使用列表和数据框精确匹配单词
- php - PHP中的阿贝尔沙堆模型
- spring-boot - Spring.boot:将请求参数绑定到具有嵌套可选的数据对象
- android-recyclerview - 如何在 Recyclerview Item Click 上打开新片段?
- swift - 将单选组分配给单选按钮
- javascript - JavaScript:对于对象中的每个对象?