2016-08-05 3 views
0

У меня есть таблица в Oracle SQL, чьи идентификаторы растут, последовательный порядок, но есть пробелы в идентификаторах из-за редактирования, например. идентификаторы в настоящее время что-то вродеOracle update query для обновления записей в последовательном порядке

22 
23 
24 
32 
33 
44 
...etc 

проверить одну почты и предлагаемое решение было, как показано ниже:

update (select t.*, row_number() over (order by id) as newid) toupdate 
    set id = newid 

Solution Provided earlier.

Теперь мой вопрос: 1) Я предполагаю, что «ЕК "отсутствует в вышеуказанном запросе.

Обновленный запрос:

update (select t.*, 
       row_number() over (order by emp_id) as newid 
     from employee t) toupdate 
set emp_id = newid; 

2) Когда я запускаю выше запрос, он дает мне ошибку «операции данных Манипулирование не правовой с этой точки зрения».

Может ли кто-нибудь объяснить, как здесь работают упомянутые решения. может ли кто-нибудь опубликовать полный запрос на обновление. Благодарю.

+0

погуглить эту ошибку он говорит, что вы обновляете вид, поэтому ваша «таблица» таблица или View? Кроме того, зачем создавать что-то, что имеет такое большое значение для числа? Действительно ли это имеет значение, что оно последовательное? https://community.oracle.com/thread/2485143?start=0&tstart=0 –

+1

@RegencySoftware он обновляет виртуальный вид, т. е. «update (select ...)». Некоторые виртуальные представления могут обновляться, но не все. Я согласен с вами в том, что пробелы в номерах emp_id не должны считаться важными. –

+0

Мой вопрос поднят из ранее предоставленного решения. Когда я попросил разъяснений, меня попросили задать свои сомнения. Поэтому я сделал это. Теперь ищем решение. Было бы замечательно узнать, что я знаю об этом обновлении. – XING

ответ

1

This solution на тот же вопрос, на который ссылался показывает, как это сделать:

update employee set emp_id = (
    with tab as (
    select emp_id, rownum r 
    from (select emp_id from employee order by emp_id) 
) 
    select r from tab where employee.emp_id = tab.emp_id 
); 

Это работает. Вы не можете обновить представление, содержащее аналитическую функцию типа row_number - см. Oracle 12C docs, ищите «Заметки о обновляемых представлениях».

+0

Спасибо за это, но я смотрел на ответ, который получил большинство голосов. Я хотел понять, что Гордон пытался сделать, что я хочу узнать в будущем. – XING

+2

О, я вижу. Я не верю, что решение Гордона может работать, потому что [как описано здесь] (http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_8004.htm#SQLRF01504) «Представление не должно содержать .. . Агрегатная или аналитическая функция ", которая является" row_number ". –

+0

Вот что я поставил под сомнение, если вы заметили в ссылке, и ответ оттуда был таким, что я должен задать ему вопрос, поэтому я сделал это. К моему удивлению, у него тоже было 2 upvotes ,,, :-))). – XING

1

Вы можете использовать merge, но вам нужно будет присоединиться к чему-то, кроме emp_id, так как вы хотите обновить эту колонку. Если нет других уникальных столбцов вы можете использовать rowid:

merge into employee target 
using (select rowid, row_number() over (order by emp_id) as emp_id from employee) source 
on (source.rowid = target.rowid) 
when matched then update set target.emp_id = source.emp_id; 
+0

Спасибо за это, но я смотрел на ответ, который получил большинство голосов. Я хотел понять, что Гордон пытался сделать, что я хочу узнать в будущем. – XING

+2

Я думаю (необычно). Ответ Гордона неверен; не уверен, почему он принят, поскольку он не работает в Oracle ...В этом случае комментарий был, вероятно, более уместным, хотя, возможно, ваш первоначальный человек не совсем понял, что он просто не работает так, как написано. –

+0

Ну, я поднял беспокойство. Уверен, что он ошибается, или я/мы ошибаемся. Он должен объяснить здесь. – XING

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