0

クラスという名前のテーブルがあります

|Record_No [PK] | Student_No  | Class_No  | Seat_No  |
=====================================================
|1              | 200910      | 2         | 20       |
|2              | 201234      | 2         | 13       |
|3              | 200965      | 2         | 1        |
|4              | 200920      | 2         | 8        |
|5              | 200911      | 2         | 9        |
|6              | 200955      | 1         | 10       |
|7              | 200924      | 1         | 9        |
|8              | 200922      | 1         | 1        |
|9              | 200901      | 2         | 11       |
|10             | 200902      | 2         | 18       |

Seat_No の番号を 1 から、クラス番号が 2 に等しい座席番号の最後のカウントまで順番に更新することは可能ですか?

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

|Record_No [PK] | Student_No  | Class_No  | Seat_No  |
=====================================================
|1              | 200910      | 2         | 1        |
|2              | 201234      | 2         | 2        |
|3              | 200965      | 2         | 3        |
|4              | 200920      | 2         | 4        |
|5              | 200911      | 2         | 5        |
|6              | 200955      | 1         | 10       |
|7              | 200924      | 1         | 9        |
|8              | 200922      | 1         | 1        |
|9              | 200901      | 2         | 6        |
|10             | 200902      | 2         | 7        |

今のところ、私はこれを使用してのみこれを達成できます

UPDATE class SET Seat_No = 1 WHERE Class_No = 2 AND Student_No = 200910;
UPDATE class SET Seat_No = 2 WHERE Class_No = 2 AND Student_No = 201234;
...

等々..

すべての student_no をクエリに入れずにこれを解決するにはどうすればよいですか? 助けてください。

4

2 に答える 2

2
update class
set seat_no = s.rn
from (
    select
        row_number() over(order by record_no) rn,
        record_no
    from class
    where class_no = 2
) s
where class.record_no = s.record_no

すべてのクラスを更新する場合:

update class
set seat_no = s.rn
from (
    select
        row_number() over(partition by class_no order by record_no) rn,
        record_no
    from class
) s
where class.record_no = s.record_no
于 2013-02-26T17:09:18.007 に答える
1

例で Record_No が 1-5 であると仮定すると、次のように使用できます。

UPDATE class SET Seat_No = Record_No WHERE Class_No = 2

そうでない場合は、RDBMS によって異なります。

postgresql のアプローチは次のとおりです。

UPDATE  Class C
SET     Seat_No = t.rn
FROM    (
       SELECT Record_No, ROW_NUMBER() OVER (ORDER BY Record_No) rn
        FROM Class
       WHERE Class_no = 2
        ) t
WHERE   C.Record_No = t.Record_No

SQL フィドルのデモ

于 2013-02-26T17:02:51.317 に答える