1

这是我试图解决的一种情况。我有一个装有重复项的表。发生这种情况是因为类似的行是从两个不同的来源加载的。这是在包装中处理的。

但我想删除那些重复的行。这里没有关键属性(我不能用没有PK)。这两个来源是克利夫兰市和俄亥俄州立大学。我有一列显示该行是从哪个源加载的(DataSource列)。

因此在行中它显示为DataSource = 'Cleveland'DataSource = 'OhioState'

下面是我坚持的示例。你们能有不同的方法来删除那些我的行似乎效果不佳吗?再次感谢伙计们..我认为我试图接近的方式甚至不正确...

    IF OBJECT_ID('tempdb..#Ohio') IS NOT NULL 
     BEGIN 
     DROP TABLE #Ohio
     END 

  ;WITH Oh AS 
    ( SELECT ROW_NUMBER()OVER
      (
        PARTITION by UID,ADDRESS,CITY,STATE,Zip
          ORDER BY 
            UID
       ) AS IA,UID,ADDRESS,City,State,Zip FROM F_staRes
     ) 
    SELECT * INTO #Ohio   FROM Oh WHERE IA> 1   AND  DataSource='Ohio'  

    IF OBJECT_ID('tempdb..#Clevland') IS NOT NULL 
    BEGIN 
   DROP TABLE #Clevland
   END 

    ;WITH Cle AS 
     ( SELECT ROW_NUMBER()OVER
      (
           PARTITION by UID,ADDRESS,CITY,STATE,Zip
       ORDER BY 
        UID
         ) AS CE,UID,ADDRESS,City,State,Zip FROM F_staRes
         ) 
   SELECT * INTO #Clevland   FROM Cle WHERE CE> 1  AND  DataSource!='Ohio' 

    select * from #Clevland--I want to delete this records
     Intersect 
     select * from #Ohio
4

2 回答 2

1
  1. 我认为关键词 INTERSECT 没有正确使用。解释如下。您可以点击链接获取详细信息。

EXCEPT 返回左侧查询中未在右侧查询中找到的任何不同值。INTERSECT 返回由 INTERSECT 操作数左侧和右侧的查询返回的任何不同值

http://msdn.microsoft.com/zh-cn/library/ms188055.aspx

  1. 为了实现您的目的,您可以尝试命令合并。

    ;
    merge into #Clevland as target
    using  #Ohio as source
    on (target.UID = source.UID) -- you could add ADDRESS,City,State,Zip
    when not matched
       insert into target (UID) values (source.UID)
    ;
    

希望这会有所帮助。

于 2012-10-16T01:52:16.147 回答
0

也许它会帮助你

;WITH cte AS
 (
  SELECT ROW_NUMBER() OVER (PARTITION BY UID, ADDRESS, City, State, Zip, DataSource ORDER BY UID) AS Dup
  FROM dbo.F_staRes
  )
DELETE cte
WHERE Dup > 1
于 2012-10-15T22:28:24.837 回答