日期:2014-05-16  浏览次数:20529 次

重复列名的inner join问题
有这样一段程序:

WITH    cte
          AS ( SELECT   b.max_2014 ,
                        a.index_id ,
                        b.min_2014 ,
                        b.exam_sort ,
                        b.variation_char,
                        POWER(ABS(( a.ori_value - b.min_2014 ) / ( b.max_2014
                                                              - b.min_2014 )),
                              1.4) * 40 + 60 AS iscontr2
               FROM     court_stat a
                        INNER JOIN range_rule b ON a.index_id = b.index_id
             )

如果列名index_id是唯一的值,则运算结果正常。
但是,如果index_id不唯一,形如:
index_id         ori_value 结果
1_07         0.222222         90.02903452
1_07         0.428571         90.02903452
1_07         1         90.02903452

如果此时用上述代码,第一个index_id对应的结果运算正常,但是后面的index_id对应的结果都会引用第一个index_id对应的结果值。实际上,列ori_value的值是不同的,因此每一个index_id对应的结果本质上是不同的。
稍微抽象一下:当有多个相同的列值时,如何使用内关联inner join为相同列值对应的不同目标计算对象赋予不同的值?
------解决方案--------------------
try this,

with cte as
(select b.max_2014,
        a.index_id,
        b.min_2014,
        b.exam_sort,
        b.variation_char,
        power(abs((a.ori_value-b.min_2014)/( b.max_2014-b.min_2014)),1.4)*40+60 'iscontr2'
 from (select distinct index_id,ori_value from court_stat) a
 inner join range_rule b on a.index_id = b.index_id
)
select * from cte

------解决方案--------------------
用cte的时候最好用主键进行关联吧,否则递归的时候肯定会出问题