SQL 使用内连接从查询中删除所有重复项(3 个表在一起)

问题描述 投票:0回答:1

我正在尝试使用内部联接(总共 3 个表)创建查询,以便每个项目仅显示一个结果(在本例中它将是 MATERIAL_ID)。

我创建了这个查询:

`SELECT DISTINCT
A.ORDER_ID, A.BATCH_ID, A.MATERIAL_ID, B.MATERIAL_DESC, A.TARGET_QTY, A.DISPENSED_QTY,     A.REMAINING_QTY, A.DISPENSED_UOM, A.DISPENSE_STATUS, B.MATERIAL_TYPE, A.UNIT_PROCEDURE_ID, A.SPLIT_ID, A.BOM_REF_NO, C.CONTAINER_STATUS, C.AREA_ID, C.QTY_STATUS, C.EXPIRE_DATE 
FROM
MM_DISP_MATL_ST A
INNER JOIN 
MM_MATERIAL_SP B
ON A.MATERIAL_ID = B.MATERIAL_ID
INNER JOIN
MM_CONTAINER_ST C
ON B.MATERIAL_ID = C.MATERIAL_ID
AND C.CONTAINER_STATUS = 'Unrestricted' 
AND C.QTY_STATUS IN ('Full','Partial')
WHERE A.ORDER_ID = :pORDER_NUMBER
ORDER BY A.BOM_REF_NO`

但它为我提供了所有重复的 MATERIAL_ID、AREA_ID 和 EXPIRE_DATE 信息。

如何修改此查询,以便每个 MATERIAL_ID 或 BOM_REF_NO 仅显示 1 个结果,并选择最早的 EXPIRE_DATE?

我尝试了 DISTINCT,但给了我我不想要的重复项。另外添加额外的 ORDER BY 也没有帮助

duplicates drop-duplicates
1个回答
0
投票

您可以在 where 子句中说您想要具有最早到期日期的记录

... 
WHERE A.ORDER_ID = :pORDER_NUMBER
  AND  C.EXPIRE_DATE = (SELECT MIN(EXPIRE_DATE) FROM MM_CONTAINER_ST C2
                         WHERE B.MATERIAL_ID = C2.MATERIAL_ID)
ORDER BY A.BOM_REF_NO`
© www.soinside.com 2019 - 2024. All rights reserved.