1

これが私が解決しようとしている状況です。重複がロードされたテーブルがあります。これは、2 つの異なるソースから同様の行がロードされたために発生しました。それはパッケージで世話をされています。

しかし、重複している行を削除したいと思います。ここにはキー属性はありません (PK は使用できません)。2 つの情報源は、クリーブランド市とオハイオ州です。そして、行がどのソースからロードされたかを示す列があります(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 を試すことができます。

    ;
    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 に答える