2011-10-28 5 views
1

私はこのようなテーブルを持っています。 「ID」の値を持つ「名前」の最初の発生とレコードの場合重複したレコードを特定し、最初に出現したIDで更新してください。

  • 、私は「ソースID」を更新したい
  • の場合:ある私は何をしたい

     
    ID Name  Source ID 
    1 Orange  0 
    2 Pear   0 
    3 Apple  0 
    4 Orange  0 
    5 Apple  0 
    6 Banana  0 
    7 Orange  0 
    

    SECONDと「名前」の連続発生を持つレコードは、私が最初に出現したので

の「ID」の値を「ソースID」を更新する、次のように、テーブルを更新する必要があります。

 
ID Name  Source ID 
1 Orange  1 
2 Pear   2 
3 Apple  3 
4 Orange  1 
5 Apple  3 
6 Banana  6 
7 Orange  1 

がどのようにSQL(Oracleが特になければ、私は、同様の一般的なSQLで大丈夫だよ)でそれを行うことができます...

ありがとう!

+1

うれしいですこと。これまでに何を試みましたか? –

+0

どのOracleのバージョンですか?分析サポートは9iから始まります。あなたは何を使ってみましたか? –

答えて

1

このような何かが何をしたいあなたを取得する必要があります:

update table a 
set source_id = (
    select min(id) 
    from table b 
    where b.name = a.name 
); 
+0

OracleはUPDATE

エイリアスでエイリアスをサポートしていますか? – sll

+0

はい。この文はOracle上で動作します – Craig

1
UPDATE MyTable 
SET SourceID = Sub.ID 
FROM MyTable 
INNER JOIN (SELECT MIN(ID) as ID, Name FROM MyTable GROUP BY Name) Sub 
    ON Sub.Name = MyTable.Name 

名前ごとに最小IDを示すサブクエリを使用してください。 ID以来

1

(右?)自動インクリメント値を成長さFirstIDがMIN(ID)ように計算することができます

UPDATE fruits 
    SET SourceID = ag.ID 
FROM fruits f 
INNER JOIN 
(
    SELECT MIN(ID) as ID, Name FROM @fruits 
    GROUP BY Name 
) ag 
ON ag.Name = f.Name 
関連する問題