多表关联导致数据重复的问题
2016-10-12 11:10
926 查看
做综合月报时,需要多张接口表关联取数据,关联时,中间有一个接口表的数据有重复,会导致整个数据块有问题。
在做综合月报时,因为规整库人口数据中有8个区划不在t_dim_area表中。导致left join 时,会有部分数据丢失,所以采取了默认将那8个区划默认为该区划下的存在的区划排序后第一条。
('340225271029','340225271032','340225271028','340225271031','340225271030','340225271034','340225271033','340225271035')
将这8个区划默认为
CASE WHEN AREACODE NOT IN
('340225271029','340225271032','340225271028','340225271031','340225271030','340225271034','340225271033','340225271035') THEN AREACODE
ELSE (
SELECT areacode
FROM (
SELECT AREACODE
FROM T_FACT_ZHYB_PEOHOUSE_MON
WHERE areacode LIKE '340225100%'
ORDER BY areacode
)
WHERE ROWNUM = 1
)
END AreaCode
处理后的sql:
返回结果显示有9个区划是一样的,因为将8个区划默认了。所以会有9个一样的区划。
SELECT areacode,COUNT(1) FROM (
SELECT
CASE WHEN AREACODE NOT IN
('340225271029','340225271032','340225271028','340225271031','340225271030','340225271034','340225271033','340225271035') THEN AREACODE
ELSE (
SELECT areacode
FROM (
SELECT AREACODE
FROM T_FACT_ZHYB_PEOHOUSE_MON
WHERE areacode LIKE '340225100%'
ORDER BY areacode
)
WHERE ROWNUM = 1
)
END AreaCode
,SUM(RKZS) RKZS
,SUM(LSYXWLHL_FZ) LSYXWLHL_FZ
,SUM(LSYXWLHL_FM)LSYXWLHL_FM
,SUM(JTHWLZFBL_FZ) JTHWLZFBL_FZ
,SUM(JTHWLZFBL_FM) JTHWLZFBL_FM
,SUM(LSRKLRL_FZ) LSRKLRL_FZ
,SUM(LSRKLRL_FM) LSRKLRL_FM
,SUM(YSRKLRL_FZ) YSRKLRL_FZ
,SUM(YSRKLRL_FM) YSRKLRL_FM
FROM T_FACT_ZHYB_PEOHOUSE_MON
WHERE MONTH ='201609'
GROUP BY areacode
) GROUP BY areacode
HAVING COUNT(1)>1
此时,在与t_dim_area关联时,数据还是正常的。但是因为后面还有关联表,会导致其他的表中区划为340225100001的数据重复计算8次。从而导致数据重复。所以在多张表关联时,一定要确保关联的几张表中关联字段不会出现重复。
此时有三张表,test,test01,test02。
可以发现在表test01中,有一条name重复的数据。
当test与test01关联时,虽然test01表中有重复的那么,但是此时是计算test01的counts合计。有重复的计算进去也是对的。
当test与test02关联时,两张表都 没有重复数据,计算tets02中的counts合计也是对的。
但是当三张变都关联时,计算test02的counts合计就会出错。
这就是因为test01表中有一条重复数据,而sql执行时是从下往上执行sql的,所以在test02余test01关联时,test02的数据中name为a1的数据counts会多计算一次。所以计算的sum(counts)会多出100,为700.而实际上应该是600.
此时解决方案是要将有重复数据的test01的重复数据合并为一条。因为name字段是关联字段,是不允许重复的。
此时test01表中就没有重复数据,而且sum(counts)值也没有变少或变多。将处理后的表作为关联表使用。
此时计算的test02的sum(counts)的值就是正确的了。
所以多表关联时,切记关联表中所需要关联的字段一定不能有重复。有重复的话要先去重,在关联。
在做综合月报时,因为规整库人口数据中有8个区划不在t_dim_area表中。导致left join 时,会有部分数据丢失,所以采取了默认将那8个区划默认为该区划下的存在的区划排序后第一条。
('340225271029','340225271032','340225271028','340225271031','340225271030','340225271034','340225271033','340225271035')
将这8个区划默认为
CASE WHEN AREACODE NOT IN
('340225271029','340225271032','340225271028','340225271031','340225271030','340225271034','340225271033','340225271035') THEN AREACODE
ELSE (
SELECT areacode
FROM (
SELECT AREACODE
FROM T_FACT_ZHYB_PEOHOUSE_MON
WHERE areacode LIKE '340225100%'
ORDER BY areacode
)
WHERE ROWNUM = 1
)
END AreaCode
处理后的sql:
返回结果显示有9个区划是一样的,因为将8个区划默认了。所以会有9个一样的区划。
SELECT areacode,COUNT(1) FROM (
SELECT
CASE WHEN AREACODE NOT IN
('340225271029','340225271032','340225271028','340225271031','340225271030','340225271034','340225271033','340225271035') THEN AREACODE
ELSE (
SELECT areacode
FROM (
SELECT AREACODE
FROM T_FACT_ZHYB_PEOHOUSE_MON
WHERE areacode LIKE '340225100%'
ORDER BY areacode
)
WHERE ROWNUM = 1
)
END AreaCode
,SUM(RKZS) RKZS
,SUM(LSYXWLHL_FZ) LSYXWLHL_FZ
,SUM(LSYXWLHL_FM)LSYXWLHL_FM
,SUM(JTHWLZFBL_FZ) JTHWLZFBL_FZ
,SUM(JTHWLZFBL_FM) JTHWLZFBL_FM
,SUM(LSRKLRL_FZ) LSRKLRL_FZ
,SUM(LSRKLRL_FM) LSRKLRL_FM
,SUM(YSRKLRL_FZ) YSRKLRL_FZ
,SUM(YSRKLRL_FM) YSRKLRL_FM
FROM T_FACT_ZHYB_PEOHOUSE_MON
WHERE MONTH ='201609'
GROUP BY areacode
) GROUP BY areacode
HAVING COUNT(1)>1
此时,在与t_dim_area关联时,数据还是正常的。但是因为后面还有关联表,会导致其他的表中区划为340225100001的数据重复计算8次。从而导致数据重复。所以在多张表关联时,一定要确保关联的几张表中关联字段不会出现重复。
此时有三张表,test,test01,test02。
可以发现在表test01中,有一条name重复的数据。
当test与test01关联时,虽然test01表中有重复的那么,但是此时是计算test01的counts合计。有重复的计算进去也是对的。
当test与test02关联时,两张表都 没有重复数据,计算tets02中的counts合计也是对的。
但是当三张变都关联时,计算test02的counts合计就会出错。
这就是因为test01表中有一条重复数据,而sql执行时是从下往上执行sql的,所以在test02余test01关联时,test02的数据中name为a1的数据counts会多计算一次。所以计算的sum(counts)会多出100,为700.而实际上应该是600.
此时解决方案是要将有重复数据的test01的重复数据合并为一条。因为name字段是关联字段,是不允许重复的。
此时test01表中就没有重复数据,而且sum(counts)值也没有变少或变多。将处理后的表作为关联表使用。
此时计算的test02的sum(counts)的值就是正确的了。
所以多表关联时,切记关联表中所需要关联的字段一定不能有重复。有重复的话要先去重,在关联。
相关文章推荐
- 网络充值支付过程游戏公司如何防止由于页面多次刷新导致重复提交数据导致多次充值的问题
- order by 导致分页数据重复问题
- SQL删除数据因外键关联导致花费时间太长----(外键列上增加索引解决此问题)
- 防止用户多次点击导致重复提交数据的问题
- 数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
- 如何避免mysql 主从同步中由于数据记录找不到和主键重复错误导致的同步异常问题
- d3中x轴数据名称重复导致缺失的问题
- 【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题
- order by 导致分页数据重复问题
- a标签导致数据重复提交(ie下神奇的数据重复提交问题)
- mysql 并行写数据导致重复的问题,加间隙锁解决
- d3中x轴数据名称重复导致缺失的问题
- 数据库返回的数据由于空格导致请求到的数据出现重复问题
- InnerJoin分页导致的数据重复问题排查
- 关于jqplot同一个div重用,导致数据重复问题
- Activity重复创建,导致界面数据刷新的问题
- 【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题
- Hibernate懒加载问题导致View层无法获取关联数据的问题
- VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
- VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结