2014-12-30 3 views
1

* Обновлен осветленные вопрос и примерSQL обновления данных уложены, как связанный список

У меня есть таблица, которая данные представлены в виде связанного списка

т.е.

ID | FROM_STATE | TO_STATE | SOME_OTHER_COLUMN

Мне нужно изменить «указатели» вокруг, чтобы удалить состояние BAR. Как вы видите ниже, foo переходит в bar и bar переходит в com и т. Д. Я хочу, чтобы foo перешел непосредственно в com и от QUAX до FIZZ. Кроме того, значение из «SOME_OTHER_COLUMN» должно быть выбрано из удаляемой записи и использоваться вместо значения для «SOME_OTHER_COLUMN» в обновляемой записи.

ОТ

ID|FROM_STATE|TO_STATE|SOME_OTHER_COLUMN 
1| FOO  | BAR | xxx 
1| BAR  | COM | zzz 
2| QUAZ  | BAR | aaa 
2| BAR  | FIZZ | bbb 

TO:

ID|FROM_STATE|TO_STATE|SOME_OTHER_COLUMN 
1| FOO  | COM | zzz 
2| QUAX  | FIZZ | bbb 

Я начал писать автообъединение и пытается что-то вроде:

update 
FOO a 
    join FOO b 
     on a.ID = b.ID 
    and a.FROM_STATE = b.FROM_STATE 

    set a.TO_STATE = b.TO_STATE 
where b.FROM_STATE='BAR' 
    and a.TO_STATE='BAR'; 

Это не сработало, строки не были изменены ,

Я установил таблицу в приведенном ниже SQLFilldle. Любая помощь приветствуется. DB оракул (не версия)

http://sqlfiddle.com/#!2/7e8d08/1

+1

На основании Вашего описания результата: '1 | FOO | БАР | xxx' должен быть фактически '1 | FOO | COM | xxx' ??? – AaronLS

+1

Все идентификаторы равны 1, а a.FROM_STAGE может быть a.FROM_STATE? – agentpx

+0

@AaronLS, да, это была опечатка. Спасибо за уловку – AfterWorkGuinness

ответ

0

Вам необходимо 2 запросов, обновление и удаление объекта.

UPDATE tbl t SET (To_State,SomeColumn) = 
(SELECT To_State, SomeColumn 
    FROM tbl 
    WHERE From_State = t.To_State 
    AND Id = t.Id) 
WHERE To_State = ? 
AND Id = ?; 

DELETE FROM tbl 
WHERE From_State = ? 
AND Id = ?; 
+0

Спасибо за ваш ответ, у меня много строк и на самом деле не нужно проходить и идентифицировать идентификационные номера на каждом, которые соответствуют шаблону, а затем перечислять их в предложении where. – AfterWorkGuinness

+0

Я понятия не имею, что вы имеете в виду «пройти через каждую строку». Вы просто передаете идентификатор связанного списка и from_state строки, которую хотите удалить. Если вы пытаетесь сделать что-то другое, вы должны обновить свой вопрос. – wvdz

+0

Я не знаю идентификатора каждой строки, которую хочу удалить, я полагаю, я мог бы попробовать что-то вроде, где ID (выбрать ID ....) – AfterWorkGuinness

0
update 
FOO a 
join FOO b 
    on a.ID = b.ID 
and a.FROM_STATE = b.FROM_STATE 

set a.TO_STATE = b.TO_STATE 
where b.FROM_STATE = a.TO_STATE; 
+3

Возможно, было бы полезно включить объяснение, как это отличается от того, что пытался использовать ОП и является ответом на вопрос. – fejese

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