2013-02-26 3 views
0

у меня есть таблица с именем классаКак обновлять данные столбца?

|Record_No [PK] | Student_No | Class_No | Seat_No | 
===================================================== 
|1    | 200910  | 2   | 20  | 
|2    | 2| 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    | 2| 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 = 2; 
... 

и так далее ..

Как я могу решить эту проблему не помещая каждый student_no в запрос? PLS помощи.

+1

вы используете MySQL или Postgres? – Lamak

+0

Я использую Postgres .. – oyan11

ответ

1

Если предположить, что Record_No в вашем примере 1-5, вы можете использовать его:

UPDATE class SET Seat_No = Record_No WHERE Class_No = 2 

Если нет, то это зависит от РСУБД.

Вот подход 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 Fiddle Demo

+0

благодарю вас за ответ .. я отредактировал мой вопрос для разъяснений .. – oyan11

+0

@ oyan11 - попробуйте демонстрацию скрипта выше - он должен работать с вашими изменениями. Record_No был просто «быстрым подходом» - используйте другой запрос для ваших нужд. Удачи. – sgeddes

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 
+0

спасибо, но есть ли другой способ решить мою проблему без использования record_no? подождите, я отредактирую таблицу для уточнения. – oyan11

+0

@ oyan11 Ваше изменение не влияет на решение. Вы попробовали? –

+0

спасибо! это сработало, я сожалею об этом, я был в замешательстве. – oyan11

Смежные вопросы