首页 > 解决方案 > 如何在右表上仅使用 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  

标签: sql

解决方案


我将创建查询,从而为表 R 和 OA 中的每个唯一操作返回所需的一行。然后将这些查询设置为公用表表达式 (CTE)。然后在上面进行原始查询(左侧足够好,不需要左侧外部),但加入单个记录 CTE 而不是 R 和 OA。


推荐阅读