#=============================================================#
#处理主从小区问题两种sql写法的比较(改造简化后的关键问题比较)#
#=============================================================#1.问题描述现有表radio保存小区性能数据表结构描述:create table radio
(
record_id integer not null, --记录ID自增型
ne_id integer not null, --小区ID
ne_type integer default 300 not null, --小区类型
first_result date not null, --小区性能数据采集时间
data_parameters float, --小区性能参数
lac integer, --位置区
cell_id integer, --小区
master_bts integer, --主从标识
unique(ne_id,first_result)
);现在存在主从小区问题,即同一对(lac,cell_id)组合为一个物理小区,
但是存在逻辑主从小区的概念,即对同一对(lac,cell_id)来说,
master_bts=1为主小区,master_bts=0为从小区,但ne_id是不同的,
其他不存在主从小区的小区master_bts都等于1.现要求合并主从小区数据,即把从小区数据合并到其对应的主小区上,ne_id取
其主小区的ne_id.2.两种处理方法(因为表数据量较大,都分时段进行处理)  1)经理法sql
  
     --取master_bts=1数据入临时表tmp_radio_master
     
     create table tmp_radio_master as select * from radio where first_result = 'yyyy-mm-dd hh:00:00' and master_bts=1;
     
     --取master_bts=0数据入临时表tmp_radio_second
     
     create table tmp_radio_second as select * from radio where first_result = 'yyyy-mm-dd hh:00:00' and master_bts=0;
     
     --合并主从小区后入临时表tmp_radio_merge
     create table tmp_radio_merge
     (
     ne_id,
     ne_type,
     first_result,
     data_parameters,
     lac,
     cell_id,
     master_bts
     )as
     select rm.ne_id,rm.ne_type,rm.first_result,rm.data_parameters+rs.data_parameters,rm.lac,rm.cell_id,rm.master_bts
     from tmp_radio_master rm,tmp_radio_second rs
     where rm.lac = rs.lac and rm.cell_id = rs.cell_id ;
     
     --删除原表数据,插入处理后数据
     
     delete from radio where first_result = 'yyyy-mm-dd hh:00:00' ;
     
     insert into radio(
     ne_id,
     ne_type,
     first_result,
     data_parameters,
     lac,
     cell_id,
     master_bts
     ) 
     select ne_id,ne_type,frist_result,data_parameters,lac,cell_id,master_bts from tmp_radio_merge ;
     
     --删除临时表
     
     drop table tmp_radio_master;
     drop table tmp_radio_second;
     drop table tmp_radio_merge;
     
  2)程序员法sql
  
     --取该时段数据入临时表tmp_radio
     
     create table tmp_radio
     (
     ne_id,
     ne_type,
     first_result,
     data_parameters,
     lac,
     cell_id,
     master_bts
     )as select * from radio where first_result = 'yyyy-mm-dd hh:00:00' ;
     
     --设置master_bts=0的小区的ne_id=0,以便合并时取sum(ne_id)得到主小区的ne_id;
     
     update tmp_radio set ne_id=0 where master_bts = 0;
     
     --合并主从小区后入临时表tmp_raido_merge
     
     create table tmp_radio_merge
     (
     ne_id,
     ne_type,
     first_result,
     data_parameters,
     lac,
     cell_id,
     master_bts
     )as 
     select sum(ne_id),300,'yyyy-mm-dd hh:00:00',sum(data_parameters),lac,cell_id,1 
     from tmp_radio
     group by (lac,cell_id) ;
     
     --删除原表数据,插入处理后数据
     
     delete from radio where first_result = 'yyyy-mm-dd hh:00:00' ;
     
     insert into radio(
     ne_id,
     ne_type,
     first_result,
     data_parameters,
     lac,
     cell_id,
     master_bts
     )as 
     select ne_id,ne_type,frist_result,data_parameters,lac,cell_id,master_bts from tmp_radio_merge ; 
     
     --删除临时表
     
     drop table tmp_radio;
     drop table tmp_radio_merge;
     
3.容错性比较因分歧主要出现在两种算法的正确性问题和对库中所有可能情况数据的适应性问题上,现对两种算法做出容错性比较:  库中数据情况描述:  1)一个主小区对应一个从小区(合法情况)
  
     ne_id   lac   cell_id   master_bts
     1       1     1         1
     2       1     1         0
     
  2)一个主小区对应多个从小区(合法情况)     ne_id   lac   cell_id   master_bts
     3       1     2         1
     4       1     2         0 
     5       1     2         0
     
  3)多个主小区对应一个从小区(错误情况)
  
     ne_id   lac   cell_id   master_bts
     6       1     3         1
     7       1     3         1 
     8       1     3         0
     
  4)多个主小区对应多个从小区(错误情况)     ne_id   lac   cell_id   master_bts
     9       1     4         1
     10      1     4         1 
     11      1     4         0
     12      1     4         0
     
实验结论: 情况一,两种方法都能处理,均得到正确结果。          情况二,经理法没有把两个从小区数据都加到对应的主小区上,而是分别加到对应的主小区上从而得到两条记录,ne_id都为该主小区ne_id,
                  待插入记录时会报违反唯一性约束的错误结果,即经理法对这种合法情况都不能处理;而程序员法可以对此情况正确处理。
                  
          情况三,经理法把从小区数据加到对应的两条主小区记录上,导致原表数据总量变大;程序员法会出现ne_id错误,但能保持原表数据总量不变。
          
          情况四,经理法处理完后会有四条记录,同样会出现情况二中出现的错误;程序员法同样会出现ne_id错误,但也能保持原表数据量不变。
          
          
4.结论:待对数据库中错误数据情况进行处理后,程序员法肯定能正确的执行,并保证结果的正确性,但经理法依然不能处理情况二的合法情况,出现sql错误。5.欢迎审核并提供意见。