日期:2014-05-17  浏览次数:20401 次

CTE删除重复行的疑问
;with gaga as
(select ROW_NUMBER() over(PARTITION by 姓名,课程,分数 order by 分数)as rownum,* from tb)
delete from gaga where rownum<>1
还有类似的
update tb set field1=3 from tb inner join tb2 on ..

select出来的或是join得到的都是中间结果集,这个中间结果集是怎么与原始的行相关联的,如果中间集的一行对应原始的多行会怎样.

一直总是研究select的内幕,忽略了update delete的内部机制,
有大神提点一二吗
------解决方案--------------------
用cte得出一个中间结果集如test,然后与原有数据表关联,然后删除原有数据表,更新也是一样的。但是CTE只能在紧跟着的那个sql语句中有效,第二条就无效了,如果想一直用就要用临时表或者表变量。
------解决方案--------------------
select出来的或是join得到的都是中间结果集

这种情况下是更新和删除是会报错的

这种方法也只能对里面只有一个表的select 结果集进行删除更新

如果很难理解,那你想想对于视图的更新和删除。