2

背景

一意の行 ID、OrderNumber、guestCount などの情報を含む一時テーブルがあります。このテーブルには RowID と OrderNumber が既に存在しており、各 orderNumber の欠落している guestCount を埋めるために新しいクエリを実行しています。次に、この情報で一時テーブルを更新したいと思います。

私が現在持っているものは、RowID のみが一意であるため、同じ OrderNumber を持つ複数のアイテムが存在する可能性があることを意味します。

    RowID | OrderNumber | guestCount
    1     | 30001       | 0
    2     | 30002       | 0
    3     | 30002       | 0
    4     | 30003       | 0

私のクエリは次のテーブルを返し、orderNumber ごとに 1 つの合計ゲスト数のみを返します。

    OrderNumber | guestCount
    30001       | 3
    30002       | 10
    30003       | 5

最終的なテーブルは次のようになります。

    RowID | OrderNumber | guestCount
    1     | 30001       | 3
    2     | 30002       | 10
    3     | 30002       | 0
    4     | 30003       | 5

orderNumber ごとに 1 つのエントリ (どちらでも構いません) を更新することにのみ関心がありますが、現在のロジックではエラーが発生しています。

UPDATE temp
SET temp.guestCount = cc.guestCount
FROM( SELECT OrderNumber, guestCount
      FROM (SELECT OrderNumber, guestCount, RowID = MIN(RowID)
      FROM #tempTable
      GROUP BY RowID, OrderNumber, guestCount) t)temp
INNER JOIN queryTable q ON temp.OrderNumber = q.OrderNumber

このロジックがこれを行う有効な方法であるかどうかはわかりませんが、集計関数と GROUP 関数を使用しているため、更新でエラーが発生することはわかっています。この操作を別の方法で行う方法はありますか?

4

1 に答える 1

3

row_number()CTE でを使用して、更新する行を定義できます。これは、更新用のグループの最初の行を識別します。

with toupdate as (
      select tt.*, row_number() over (partition by OrderNumber order by id) as seqnum
      from #tempTable tt
     )
UPDATE toupdate
    SET toupdate.guestCount = q.guestCount
    FROM toupdate
    INNER JOIN queryTable q
    ON temp.OrderNumber = q.OrderNumber
    where toupdate.seqnum = 1;

クエリの問題はtemp、集計サブクエリに基づいていることです。このようなサブクエリは、元のクエリの行と 1 対 1 の関係がないため、更新できません。CTE の使用row_number()は更新可能です。さらに、setステートメントはcc、クエリで定義されていないテーブル エイリアスを使用しています。

于 2013-07-29T18:48:00.687 に答える