2010-06-22 13 views
13

Uwaga: I am zadaje pytanie, na które chcę odpowiedzieć. Wiem, że to pytanie oznacza, że ​​baza danych jest źle skonfigurowana. Tak więc zagłosuję za każdą odpowiedzią, która sugeruje zmianę sposobu ustawiania tabeli.Oracle: skopiuj wiersz, aktualizując jedno pole.

Muszę zduplikować kilka wierszy, zmieniając jedną wartość.

name col1 col2 
dave a nil 
sue b nil 
sam c 5 

musi stać:

name col1 col2 
dave a nil 
dave a a 
sue b nil 
sue b a 
same c 5 

IE dla wszystkich wpisów w tej tabeli, gdzie col2 is null, należy utworzyć nowy wpis w tabeli i gdzie namecol1 są kopiowane, a col2 jest a.

+0

Czy masz na myśli 'NULL', gdy od czasu do czasu określasz' nil'? – tvCa

Odpowiedz

17

Zastosowanie:

INSERT INTO table 
    (name, col1, col2) 
SELECT t.name, t.col1, 'a' 
    FROM TABLE t 
WHERE t.col2 IS NULL 

Zakładając ani name lub col1 kolumny stanowią klucz podstawowy lub posiadają unikalną na ograniczenie albo.

+0

Poprzedni komentarz usunięty: Znalazłem swój błąd. Tak, zadziałało. Dzięki! –

+3

Ten kod wymaga powtórzenia listy kolumn tabeli i zostanie złamany, jeśli kolumna zostanie dodana do tabeli. Czy istnieje sposób, aby to zrobić bez wpisywania nieciekawych kolumn? –

+0

@kevincline Zobacz http://stackoverflow.com/a/28278824/1611055 –

3

Czy to zrobi?

INSERT INTO yourtable 
     (SELECT name, col1, 'a' 
      FROM yourtable 
     WHERE col2 is NULL); 
+0

+1 dobra odpowiedź, chociaż w rzeczywistości nie działa w moim przypadku. Wypełniam tylko niektóre pola w tabeli. –

+0

Powinieneś, ale ryzykujesz błąd ORA, jeśli w tabeli jest więcej kolumn. –

+0

Tak, założeniem była tabela zawierająca kolumny w przykładzie. – DCookie

0

Jeżeli liczba kolumn jest duża, można skopiować dane, które chcesz w tabeli tymczasowej, zmieniać dane w tabeli tymczasowej, jak chciał, a następnie skopiować zawartość tabeli tymczasowej z powrotem do oryginału i usuń tabelę tymczasową.

Powiązane problemy