3

私がやろうとしていることは次のとおりです。複数の作成者がいるテーブルがありますSingleAuthor。このテーブルには、同じ作成者が複数回含まれている場合があります。私がやりたいのは、テーブルを更新し、作成者固有の番号を追加することです。例えば:

sat_name-> sat_rowNumber Freddy-
> 1
Author2-> 2 Freddy-
> 1
AnotherOne-> 3

私はすでにこの結果を与えるクエリを持っています:

SELECT ROW_NUMBER() OVER( ORDER BY sat_name),
sat_name
FROM SingleAuthor
GROUP BY sat_name

sat_rowNumberただし、問題は、このデータを列に挿入したいということです。私はここまでクエリを実行しました:

UPDATE SingleAuthor SET sat_rowNumber = (   SELECT newTable.numb 
                                            FROM(
                                                SELECT ROW_NUMBER() OVER( ORDER BY sat_name) as numb, sat_name 
                                                FROM SingleAuthor  
                                                GROUP BY sat_name) AS newTable 
                                            WHERE newTable.sat_name =) -- the current row in the to be updated table

私がやりたいのは、現在の行がのと等しい場所にSingleAuthorテーブルを更新することです。sat_rowNumbernewTable.numbsat_namesat_namenewTable

updateステートメント内で更新されるテーブルを参照する方法に関する洞察はありますか?

4

1 に答える 1

6

あなたの質問に対する答えは次のとおりです。

where newTable.sat_name = SingleAuthor.sat_name

サブクエリ内のテーブルはスコープ外であるため、外部テーブルを参照します。ただし、これが問題である場合は、サブクエリ内のエイリアスに別のエイリアスを指定できます。

クエリは次のように効率的に記述できると思います。

with toupdate as (
    select sa.*, dense_rank() over (order by sat_name) as newVal
    from SingleAuthor sa
)
update toupdate
    set sat_RowNumber = newval

このdense_rank()関数はrow_number()、集計された値に対して実行していることを正確に実行します。

于 2012-12-20T15:14:47.447 に答える