SQL left join 数据重复

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL left join 数据重复相关的知识,希望对你有一定的参考价值。

是这样的 有一张物料表BK_goods(主键是goodsId),另有一张BOM表SJ_nparts(主键partId,同事包含父类节点parentId,parentId包含在partId),现有一张表Test以本及物料编码和父级物料编码为联合主键,现在我查询出来的届国际有重复所以无法向Test表中插入数据。
select bg.goodsCode as itemno,isnull(bg2.goodsCode,'0000') as f_itemnofrom [MESBT].[dbo].[SJ_nParts] sn--查询本级物料及数量left join [MESBT].[dbo].[BK_goods] bg on sn.goodsId=bg.goodsId--查询上级物料left join [MESBT].[dbo].[SJ_nParts] sn2 on sn2.parentId=sn.partIdleft join [MESBT].[dbo].[BK_goods] bg2 on sn2.goodsId=bg2.goodsId
请教怎么处理!

1、Select 语句 加 Distinct

2、考虑部分记录可能已经存在于 Test 表,所以 Insert into Test 的时候 加个 Where 语句
例如
Insert Into Test (itemno,f_itemno)
select distinct bg.goodsCode as itemno,isnull(bg2.goodsCode,'0000') as f_itemno
from [MESBT].[dbo].[SJ_nParts] sn
--查询本级物料及数量
left join [MESBT].[dbo].[BK_goods] bg on sn.goodsId=bg.goodsId
--查询上级物料
left join [MESBT].[dbo].[SJ_nParts] sn2 on sn2.parentId=sn.partId
left join [MESBT].[dbo].[BK_goods] bg2 on sn2.goodsId=bg2.goodsId
Left Join Test t On bg.goodsCode = t.itemno And isnull(bg2.goodsCode,'0000') = t.f_itemno
Where t.itemno is null And t.f_itemno is null
参考技术A select distinct 再加上后面那段追问

没用的

追答

select distinct * from (
select bg.goodsCode as itemno,isnull(bg2.goodsCode,'0000') as f_itemno
from [MESBT].[dbo].[SJ_nParts] sn
--查询本级物料及数量
left join [MESBT].[dbo].[BK_goods] bg on sn.goodsId=bg.goodsId
--查询上级物料
left join [MESBT].[dbo].[SJ_nParts] sn2 on sn2.parentId=sn.partId
left join [MESBT].[dbo].[BK_goods] bg2 on sn2.goodsId=bg2.goodsId
)

本回答被提问者采纳

SQL语句多表left join SUM出现的重复数据问题!

A表生产批号唯一

我做出来left join 结果领料数量会多出来 因为A对BCD表都是一对多的关系 C表与D表是多对多的关系

参考技术A select a.*,bb.领料数量,dd.完工数量
from a
left join (select 生产批号,sum(领料数量) as 领料数量 from b group by 生产批号) bb
on a.生产批号=b.生产批号
left join (select cc.生产批号,sum(d.完工数量) as 完工数量
from (select distinct 生产批号,rcid from c) cc,d
where c.rcid=d.rcid
group by c.生产批号
) dd on a.生产批号=dd.生产批号
;追问

消息 4104,级别 16,状态 1,第 1 行
无法绑定由多个部分组成的标识符 "b.生产批号"。
消息 4104,级别 16,状态 1,第 1 行
无法绑定由多个部分组成的标识符 "c.RCID"。
消息 4104,级别 16,状态 1,第 1 行
无法绑定由多个部分组成的标识符 "c.生产批号"。

追答

select a.*,bb.领料数量,dd.完工数量
from a
left join (select 生产批号,sum(领料数量) as 领料数量 from b group by 生产批号) bb
on a.生产批号=bb.生产批号
left join (select cc.生产批号,sum(d.完工数量) as 完工数量
from (select distinct 生产批号,rcid from c) cc,d
where c.rcid=d.rcid
group by c.生产批号
) dd on a.生产批号=dd.生产批号

本回答被提问者采纳

以上是关于SQL left join 数据重复的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句多表left join SUM出现的重复数据问题!

leftjoin后,左表怎样去掉重复记录

SQL LEFT JOIN 不重复相同的行值

执行sql语句,table1 left join table2 on...... 此时table2有重复的数据,从而导致最后的临时表也会出现

Transact-SQLSQL Server自动把left join自动转化为inner join以及关联时的数据重复问题

mysql left join 右表存在重复数据,怎么处理