sql查询单位是否末级存在的数据错误

缘由:目前遇到一个棘手的问题如下,

数据库做结转功能,将2018年的单位数据结转(结转:其实就是将2018年的单位数据复制一遍)到2019年。但是有些单位在2018年有效,到了2019年已经停用。有的单位下级全部停用,只剩下本单位。此时,该单位就是末级,但是数据库记录并没有修改。仍然是非末级单位。这就导致数据存在错误。如下,单位1和教育单位三级没有下级,仍然是非末级单位。这就时错误的记录数据。

一、数据表结构

sql语句:

是否末级: 0:非末级   1:是末级

DROP TABLE IF EXISTS `aac01`;
CREATE TABLE `aac01` (
  `AAC000` varchar(15) NOT NULL DEFAULT '' COMMENT '系统码',
  `AAC001` varchar(15) DEFAULT NULL COMMENT '单位编码',
  `AAC002` varchar(15) DEFAULT NULL COMMENT '单位名称',
  `AZY002` varchar(15) DEFAULT NULL COMMENT '是否末级',
  `AZY001` varchar(15) DEFAULT NULL COMMENT '父级码',
  PRIMARY KEY (`AAC000`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of aac01
-- ----------------------------
INSERT INTO `aac01` VALUES ('1001', '001', '财政局', '0', 'root');
INSERT INTO `aac01` VALUES ('10010001', '001001', '单位1', '0', '1001');
INSERT INTO `aac01` VALUES ('10010002', '001002', '单位2', '1', '1001');
INSERT INTO `aac01` VALUES ('10010003', '001002', '单位3', '1', '1001');
INSERT INTO `aac01` VALUES ('1002', '002', '教育局', '0', 'root');
INSERT INTO `aac01` VALUES ('10020001', '002001', '教育单位1', '0', '1002');
INSERT INTO `aac01` VALUES ('100200010001', '002001001', '教育单位三级', '0', '10020001');
INSERT INTO `aac01` VALUES ('10020002', '002002', '教育单位2', '1', '1002');

二、查询思路(就是在非末级单位中筛选出错误的数据,即是末级单位,而标记非末级单位的错误数据)

第一步:首先将非末级单位全部查询出来,那么就在这里面有存在错误的记录数据。

第二步:通过查询出来的这张表记录字段系统码关联主表aac01的父级码,来判断非末级单位的系统码被多少单位引用。其实就是找是否有下级单位。查询的结果是非末级单位有下级单位的记录,那么下面就可以从非末级单位中剔除这些有下级单位的记录数。就得到我们想到的非末级单位错误的数据。

第三步:已经从非末级单位记录数据查到存在有下级单位的系统码记录数了。

接着通过not in 去除已经有下级单位的系统码记录数,就得到没有下级单位的非末级单位错误记录数。

select * from aac01 where azy002=0 
and aac000 not in 
(select  t2.* from aac01 t1, 
(select aac000 from aac01 where azy002=0) t2 
where t2.aac000=t1.azy001);

总结:

--第一步查询出azy002属性不是末级的单位,错误的数据就在这里面
select * from aac01 where azy002='0';
--第二步:通过第一步查询的结果,用系统码关联父级编码。可以判断出哪些被引用了。
--引用的都有下属单位,数据正常。没有被引用,字段azy002又是末级的,就是错误数据。
select a.AAC000 from (select * from aac01 where azy002='0') a ,
aac01 b where a.aac000=b.azy001
--第三步:第二步已经筛选出都是被引用的单位,那么从原表中去除这些,就是没有被引用的单位。
即错误的数据。
select * from aac01 where AZY002='0' and AAC000 not in 
(select a.AAC000 from (select * from aac01 where azy002='0') a ,
aac01 b where a.aac000=b.azy001)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xinlianluohan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值