将以下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仅仅是起辅助作用。两张表自然连接后,只有取相关联字段时,由于自然连接的特性,两者是等价的,但是当你取除关联字段外的其他字段时就不等价了,你需要考虑下具体取哪张表的字段。