;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的内部机制,
有大神提点一二吗

解决方案 »

  1.   

    用cte得出一个中间结果集如test,然后与原有数据表关联,然后删除原有数据表,更新也是一样的。但是CTE只能在紧跟着的那个sql语句中有效,第二条就无效了,如果想一直用就要用临时表或者表变量。
      

  2.   

    select出来的或是join得到的都是中间结果集这种情况下是更新和删除是会报错的这种方法也只能对里面只有一个表的select 结果集进行删除更新如果很难理解,那你想想对于视图的更新和删除。
      

  3.   

    ;with gaga as
    (select 姓名,COUNT(1) as quantity from tb group by 姓名)
    delete from gaga where quantity<>1
    消息 4403,级别 16,状态 1,第 1 行
    因为视图或函数 'gaga' 包含聚合、DISTINCT 或 GROUP BY 子句或者 PIVOT 或 UNPIVOT 运算符,所以无法进行更新

    不让聚合,不会出现中间集一个行对应原始多行的情况。
    但是中间集的一行是如何返回去找到原始的对应行的呢,是不是中间集的行带有原始行的rowid
      

  4.   

    你不应该更新gaga而应该更新tb