Konstrukcja UPDATE

0

Witam, mam pewien problem z UPDATE w Microsoft SQL Server Management Studio.

Mam dwie tabele A i B. W tabeli A istnieje kilka wyjątkowych rekordów, które są ustawione na IDENTITY. W tabeli B również istnieją te rekordy, tylko się powtarzają. Chciałbym, aby w tabeli B zamiast tych powtarzających się nazw rekordów były wklejone numerki z kolumny id tabeli A.
Próbowałem zrobić coś takiego:

UPDATE dbo.B
SET B.xxx= A.id
FROM dbo.A

Jedyne co mi się zrobiło to wszystkie wartości w tabeli B, kolumnie xxx ustawiły się na 1... a, były tam różne wartości (od 1 do 8).
Nie można już tego odwrócić? Czy muszę wgrywać całą bazę danych od nowa? Jak to zrobić by wszystkie wartości tekstowe, które są w tabeli B zostały ustawione na odpowiednie identyfikatory z tabeli A?
Pozdrawiam

0

Nie jestem pewna, czy zrozumiałam, co chcesz zrobić, ale czy nie zapomniałeś dodać po czym ma łączyć te rekordy? Np. rekord z B zaktualizuj rekordem z A jeśli B.x=A.x?

0

Właśnie nie wiem jak to zrobić, by te rekordy się łączyły. W mojej tabeli B istnieją różne nazwy np. "JA, TY, ON, ONA, ONO, TY, ONA, JA" i w tabeli A również istnieją te rekordy, tylko się nie powtarzają (czyli jest ich mniej). Każdy rekord ma odpowiednie ID. Niestety, po zrobieniu funkcji UPDATE wszystkie rekordy w tabeli B zmieniły się na 1 :( a chciałbym by było coś takiego: 1,2,3,4,5,2,4,1

1

Czyli masz na myśli coś takiego:

	UPDATE dbo.B
	SET B.xxx= (select A.id from dbo.A where B.x=A.x)

gdzie xxx to aktualizowana kolumna z tabeli B, a x to kolumny, po których łączysz te tabele

0

Hmm, bardzo fajnie to wygląda, ale dalej nie działa.

Conversion failed when converting the nvarchar value 'JA' to data type int.

EDIT: Przepraszam, zrobiłem jednak błąd w podstawieniu tabel x i x :) Wszystko działa już jak należy. Bardzo dziękuję ! :)

0

Konstrukcja @shagrin jest poprawna, jednak dla dużej ilości danych zabije bazę bądź serwer.
Spróbuj tak (dużo wydajniej):

UPDATE dbo.B SET B.xxx=A.id FROM dbo.A WHERE B.x=A.x

Z tego co pamiętam, to miało to jeden feler - nie można było tabeli updejtowanej aliasować (do MS SQL Server 2000 - potem nie sprawdzałem), ale z tym da się żyć.

1

Da się aliasować tabelę updatowaną ale trzeba zrobić tak:

UPDATE t
SET t.pole = 1
FROM Tabela t
WHERE ...
0

@Marcin.Miga
Jutro sprawdzę Twoim sposobem jak to będzie wszystko działało :)
Mam jeszcze jedno dodatkowe pytanie. Załóżmy, że w mojej tabeli B zawiera się jeszcze jeden rekord: NULL. Chciałbym przenieść wszystkie niepowtarzające się rekordy do tabeli A włącznie z NULL. Jak mu nadać id? Wcześniej po prostu ignorowałem to NULL, jednak był to błędny sposób myślenia.

Tak to wcześniej u mnie wyglądało:

INSERT INTO A (x)
SELECT DISTINCT xxx
FROM B
WHERE xxx is not NULL

Próbowałem po prostu usunąć ostatnią linijkę kodu, jednak wyskakuje błąd, że NULL nie da się przenieść. Jakieś sugestie? :)

0

Jaki błąd?

1 użytkowników online, w tym zalogowanych: 0, gości: 1