如何从无外键关联的多表中查询无重复的合并数据
问题原因
你现在出现重复的核心原因是:UNION 只会对所有字段值完全一致的行去重,你UNION的两部分数据中,报价表条目对应的Quantity、Principal_Unit_Price等字段是真实业务值,而询价表对应条目这些字段都是0.00,属于不同的行,自然不会被去重,导致两个表共有的5条条目各出现两次。
解决方案
你不需要把整个询价条目表都合并进去,只需要补充报价表中不存在的询价条目即可,修改后的SQL如下:
DECLARE @EnquiryId int SELECT @EnquiryId = Enquiry_Id FROM tbl_Estimation WHERE Estimation_Id = 1 -- 先取报价表的5条现有数据 SELECT Estimation_Id, Rfx_Item_No, Material_No, RTRIM(LTRIM(Description)) AS Description, Quantity, Principal_Unit_Price, Total, Li_Discount_Percent, Li_Discount_Amount, Li_Principal_Total, Li_Principal_Currency, Li_Petromar_Unit_Price, Li_Petromar_Total, Li_Exchange_Currency, Li_Exchange_Rate, Li_Petromar_Unit_Price_Fc, Li_Petromar_Total_Fc FROM tbl_Estimation_Items WHERE Estimation_Id = 1 UNION ALL -- 因为下面只会取不存在的条目,用UNION ALL效率更高 -- 只补充询价表中、报价表没有的条目 SELECT 1 AS Estimation_Id, Rfx_Item_No, Material_No, RTRIM(LTRIM(Description)) AS Description, 0.00 AS Quantity, 0.00 AS Principal_Unit_Price, 0.00 AS Total, 0.00 AS Li_Discount_Percent, 0.00 AS Li_Discount_Amount, 0.00 AS Li_Principal_Total, 0.00 AS Li_Principal_Currency, 0.00 AS Li_Petromar_Unit_Price, 0.00 AS Li_Petromar_Total, 0.00 AS Li_Exchange_Currency, 0.00 AS Li_Exchange_Rate, 0.00 AS Li_Petromar_Unit_Price_Fc, 0.00 AS Li_Petromar_Total_Fc FROM tbl_Enquiry_Items ei WHERE Enquiry_Id = @EnquiryId -- 排除已经在报价表中存在的行,这里以Rfx_Item_No为唯一标识,也可以换成Material_No或者两者组合 AND NOT EXISTS ( SELECT 1 FROM tbl_Estimation_Items eii WHERE eii.Estimation_Id = 1 AND eii.Rfx_Item_No = ei.Rfx_Item_No )
优化说明
- 原有SQL里对
tbl_Estimation、tbl_Enquiry的左连接没有用到返回字段,也没有过滤逻辑,完全冗余,已经删除,性能更高 - 用
NOT EXISTS过滤后,UNION的第二部分只会返回需要的1条缺失条目,不会重复 - 确定不会有重复行的情况下用
UNION ALL替代UNION,不需要额外去重,查询效率更高 - 如果行项目的唯一标识是
Rfx_Item_No + Material_No的组合,修改NOT EXISTS里的关联条件即可
内容的提问来源于stack exchange,提问作者Khan Faizan
相关产品推荐
相关产品推荐

