一个困扰了我半天的问题

将以下SQL查询结果插入到目标表内,业务主键为(column1,column2,column3,colun5,column6)结果表不能保证业务主键的唯一性:

select

a.column1,

a.column2,

a.column3,

…

a.columnn

from

(select k.*

      row_number() over(partition by k.column1,k.column2 order by k.column4 desc) rn

from table k) a

inner join

(select k.*

      row_number() over(partition by k.column1,k.column2,k.column3 order by k.column4 desc) rn

from table k) b

on a. column1=b. column1

and a. column2=b. column2

and a. column4=b. column4

where a.rn=1 and b.rn=1

但是不关联表a,仅取表b,就不重复了,因此可以肯定是多关联的表a引起的重复。

那又是为什么呢?

注意到你select后面跟的是a的字段,事实上应该跟b的字段,由于是自然连接,你理所当然的以为select后跟哪张表的字段无所谓;这里的表a仅仅是起辅助作用。两张表自然连接后,只有取相关联字段时,由于自然连接的特性,两者是等价的,但是当你取除关联字段外的其他字段时就不等价了,你需要考虑下具体取哪张表的字段。

 

上一篇:Linux使用sed命令去除ip地址的第四个数字


下一篇:RN开发日常记录