Cześć Mam problem i nie mogę sobie z nim poradzić...
Mam tabele, w której chciałbym zmienić kolumnę na dane z 2 złączonych kolumn w tej samej tabeli.
[code]
Tabele Dane
ID----------------KOD----------------NAZWISKO----------------IMIE
1-----------------KOWALSKI_J---------Kowalski----------------Jan
na
ID----------------KOD----------------NAZWISKO----------------IMIE
1-----------------KOWALSKI_JAN-------Kowalski----------------Jan
[/code]
Chciałbym zrobić update na kolumnę KOD, aby było tam KOWALSKI_JAN.
Próbowałem coś takiego, ale żadna składnia nie działa...
[code]
UPDATE Dane SET KOD = CONCAT(Nazwisko,'', Imie)
UPDATE Dane SET KOD = (SELECT CONCAT(Nazwisko,'',Imie) FROM Dane)
[/code]
Jak to połączyć ?
Co to znaczy nie działa
- wiersze się nie aktualizują; wiersze się aktualizują, ale na inne wartości; komputer staje w płomieniach?
Razcej te 3 :)
Taki komunikat:
[code]
Msg 512, Level 16, State 1, Line 16
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
[/code]
Szukałem w necie, ale nic konkretnego nie udało mi się znaleźć...
Cóż, na pewno to zapytanie:
UPDATE Dane SET KOD = (SELECT CONCAT(Nazwisko,'',Imie) FROM Dane)
... nie może działać, ponieważ jest ono ekwiwalentem czegoś takiego:
for wiersz in dane:
wiersz.kod = (for wiersz in dane [...])
(tj. dla każdego wiersza próbujesz odpalić podzapytanie zwracające wszystkie połączone nazwiska oraz imiona, a nie tylko to dotyczące obecnie przetwarzanego wiersza.)
Pierwsze z Twoich zapytań wygląda lepiej:
UPDATE Dane SET KOD = CONCAT(Nazwisko,'', Imie)
Co według Ciebie jest z nim nie tak?
Patryk27 napisał(a):
Cóż, na pewno to zapytanie:
UPDATE Dane SET KOD = (SELECT CONCAT(Nazwisko,'',Imie) FROM Dane)
... nie może działać, ponieważ jest ono ekwiwalentem czegoś takiego:
for wiersz in dane: wiersz.kod = (for wiersz in dane [...])
(tj. dla każdego wiersza próbujesz odpalić podzapytanie zwracające wszystkie połączone nazwiska oraz imiona, a nie tylko to dotyczące obecnie przetwarzanego wiersza.)
Pierwsze z Twoich zapytań wygląda lepiej:
UPDATE Dane SET KOD = CONCAT(Nazwisko,'', Imie)
Co według Ciebie jest z nim nie tak?
Jakbym wiedział co jest nie tak, to od 2 dni by już działało i bym tu nie pisał przecież... Pewnie jest jakiś bzdet, ale takie rzeczy zazwyczaj są najtrudniejsze, jak widać. Programiści na pewno coś na ten temat wiedzą...
[code]
UPDATE Dane SET KOD = (CONCAT(Nazwisko,'', Imie)) ?
[/code]
Co to znaczy
nie działa
- wiersze się nie aktualizują; wiersze się aktualizują, ale na inne wartości; komputer staje w płomieniach?
Przecież Ci @Patryk27 napisał co nie działa ... próbujesz do pola kod wpisać coś takiego:
Kowalski | Jan |
---|---|
Nowak | Piotr |
... | |
Waza | Zygmunt III |
natomiast co do tego zapytania:
UPDATE Dane SET KOD = CONCAT(Nazwisko,'', Imie)
podaj komunikat, który dostajesz bo śmiem twierdzić, że będzie inny niż to
Msg 512, Level 16, State 1, Line 16
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
woolfik napisał(a):
Przecież Ci @Patryk27 napisał co nie działa ... próbujesz do pola kod wpisać coś takiego:
Kowalski Jan Nowak Piotr ... Waza Zygmunt III natomiast co do tego zapytania:
UPDATE Dane SET KOD = CONCAT(Nazwisko,'', Imie)
podaj komunikat, który dostajesz bo śmiem twierdzić, że będzie inny niż to
Msg 512, Level 16, State 1, Line 16
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
Oto komunikat po uruchomieniu polecenia:
UPDATE Dane SET KOD = CONCAT(Nazwisko,'', Imie)
[code]
Msg 8152, Level 16, State 30, Line 1
String or binary data would be truncated.
The statement has been terminated.
[/code]
jaką masz długość pola kod, imię i nazwisko? A najlepiej to daj DDL tabeli
abrakadaber napisał(a):
jaką masz długość pola kod, imię i nazwisko? A najlepiej to daj DDL tabeli
[code]
kod varchar(80)
nazwisko nvarchar(40)
imie nvarchar(40)
[/code]
kod masz varchar
a imię i nazwisko nvarchar
Czy to jakaś znacząca różnica ? Jakie rozwiązanie przyjąć ?
Udało się...
Zmieniłem na VARCHAR.
varchar
to znaki 8 bitowe a nvarchar
to unicode, który może zawierać znaki, które zajmują nawet 32 bity (4 bajty)
Jeden problem został rozwiązany, ale pojawił się kolejny:
[code]
Cannot insert duplicate key row in object 'Dane' with unique index 'PRAC.KODY'. The duplicate key value is (KOWALSKI_JAN).
[/code]
[code]
Tabela DANE
ID--------IDENT--------MOJE.KODY------------NAZWISKO----------IMIE
1---------10-----------KOWALSKI_JAN---------Kowalski----------Jan
[/code]
[code]
Tabela PRAC
ID--------IDENT--------PRAC.KODY--------NR-----------ZAM
1---------10-----------KOWALSKI_J-------222----------22/22
UPDATE PRAC SET PRAC.KODY = d.MOJE.KODY FROM PRAC p JOIN DANE d ON p.PRAC.KODY = d.MOJE.KODY
[/code]
Chciałem wypełnić kolumnę PRAC.KODY w tabeli PRAC danymi z kolumny MOJE.KODY z tabeli DANE i właśnie wyskakuje mi taki błąd...
Będę bardzo wdzięczny za pomoc...
jak masz klucz główny albo indeks unikalny na polu to nie możesz wrzucić kilku rekordów z taką samą wartością, co zresztą masz napisane w komunikacie
abrakadaber napisał(a):
jak masz klucz główny albo indeks unikalny na polu to nie możesz wrzucić kilku rekordów z taką samą wartością, co zresztą masz napisane w komunikacie
Tak, to rozumiem, ale to jest baza, którą muszę ogarnąć po spadku od kogoś...
Okazuje się, że te 2 tabele łączy jedna wspólna rzecz kolumna nazywa się "IDENT"
W tabeli "DANE" występują z jakiś powodów duplikaty i tu się SQL pewnie gubi...
Jak wyciąć duplikaty w tabeli DANE i zrobić update w tabeli PRAC ?
Jak w łatwy sposób przepisać dane z kolumny PRAC.KODY w tabeli PRAC do kolumny MOJE.KODY z tabeli DANE ?
nie mam pojęcia co chcesz zrobić
Jak wyciąć duplikaty ? Prosty i czytelny sposób :) ale tylko dla 'prostej tabelki' (bez automat.nadawania kluczy,etc.)
- tworzysz tabelkę pomocniczą (kopię tabeli_z_duplikatami)
- Wykonujesz insert do nowej tabeli as select DISTINCT kol1,kol2... from tabela_z_duplikatami
- Usuwasz dane z tabeli z duplikatami, insertujesz z tabeli pomocniczej, usuwasz tabele pomocniczą
abrakadaber napisał(a):
nie mam pojęcia co chcesz zrobić
No przecież piszę...
Jak w łatwy sposób przepisać dane z kolumny PRAC.KODY w tabeli PRAC do kolumny MOJE.KODY z tabeli DANE ?
"Cannot insert duplicate key row in object 'Dane' with unique index 'PRAC.KODY'. The duplicate key value is (KOWALSKI_JAN)."
Mowiac prosto, powyzej masz juz pewne podpowiedzi, powyzszy blad mowi, ze masz unikalny index na kolumnie: 'PRAC.KODY' czyli nie mozesz do tej kolumny wstawic wiecej niz jednej takiej samej wartosci - a probujesz wstawic wlasnie wiecej niz jeden rekord z wartoscia: (KOWALSKI_JAN).
Byc moze podales za malo informacji, aby ktos mogl pomoc, zastanow sie dlaczego wstawiasz wiecej niz jedna taka sama wartosc - czy tak powinno byc? czy moze chcesz to zmienic? moze teraz chcesz miec wiecej takich samych wartosci w docelowej tabeli (wowczas powinienes zmienic unique index na index)?
W kazdym razie pokaz nam (zrzut ekranu lub wklej txt z tabel) wszystkie rekordy z wartoscia: "KOWALSKI_JAN" ktore masz w obu tabelach, mysle, ze wowczas bedzie latwiej zrozumiec co wynika z tych danych.