Subquery returned more than 1 value

0

Wykonuję zapytanie:
UPDATE czesci SET aktualne_miejsce='Magazyn' WHERE id_komputera=1

Problem w tym, że na tabeli czesci jest trigger:

UPDATE czesci
SET data_przeniesienia = GETDATE(),
poprzednie_miejsce = (SELECT aktualne_miejsce FROM DELETED),
aktualne_miejsce = (SELECT Nr_ewidencyjny_komputera FROM komputery WHERE id_komputera=(SELECT id_komputera FROM INSERTED))
WHERE id_czesci = (SELECT id_czesci FROM INSERTED)

Dla jednego rekordu to działa, ale dla większej ilości zgłasza błąd:
Subquery returned more than 1 value.

Jak można to poprawić ?

0

Trigger jest źle napisany, nie powinien zabraniać wstawiać kilku rekordów na raz. Spróbuj napisać go jeszcze raz bez takich konstrkcji: pole = (select * costam). Jeżeli nie dasz rady tego napisać to można to zrobić kursorem.

0
AdamPL napisał(a)

Spróbuj napisać go jeszcze raz bez takich konstrkcji: pole = (select * costam).

Ale inaczej się da pobrać danych ze skasowanego lub wstawionego rekordu !

Jeżeli nie dasz rady tego napisać to można to zrobić kursorem.

A tym kursorem to jak ? Bo też nie mam żadnego pomysłu !

0
Pele2 napisał(a)

Ale inaczej się da pobrać danych ze skasowanego lub wstawionego rekordu !

Jeżeli wiesz lepiej jak to zrobić to czemu pytasz na forum?

Trigger napisany w taki sposób jak Ty to zrobiłeś, będzie działał tylko podczas operacji na jednym rekordzie, bo do pojedynczego rekordu wstawiasz wiele rekordów i nie łączysz ich po id w tym samym zapytaniu. Jeżeli zastosujesz inną konstrukcję to będziesz mógł operować na wielu rekordach na raz. Na inserted i deleted możesz operować tak jak na tabelach i łączyć je joinami.

Przykład:

update tabela
set osoba = i.poprzednia_osoba
from tabela as t
join inserted as i on i.id = t.id

ewentualnie takie konstrukcje:

update tabela
set osoba = i.poprzednia_osoba
from tabela as t
join (select kli.osoba as poprzednia_osoba
from klient as kli
join inserted as ins on ins.id = kli.id
) as i on i.id = t.id

Pele2 napisał(a)

A tym kursorem to jak ? Bo też nie mam żadnego pomysłu !

Naucz się używać kursorów to będziesz wiedział, jeżeli to dla Ciebie problem to zrób to w taki sposób jaki zaproponowałem powyżej.

0
AdamPL napisał(a)

Trigger napisany w taki sposób jak Ty to zrobiłeś, będzie działał tylko podczas operacji na jednym rekordzie, bo do pojedynczego rekordu wstawiasz wiele rekordów i nie łączysz ich po id w tym samym zapytaniu. Jeżeli zastosujesz inną konstrukcję to będziesz mógł operować na wielu rekordach na raz. Na inserted i deleted możesz operować tak jak na tabelach i łączyć je joinami.

Pele2 napisał(a)

A tym kursorem to jak ? Bo też nie mam żadnego pomysłu !

Naucz się używać kursorów to będziesz wiedział, jeżeli to dla Ciebie problem to zrób to w taki sposób jaki zaproponowałem powyżej.

kolega jak rozumiem, ma dużą wiedzę, ale jak widzę niechętnie się nią dzieli... pomoc ogólnikowa... użyj tego albo tamtego... i naucz się tego albo tamtego... dobrze, że chociaż są tu jakieś przykłady... Bo gdyby nie te przykłady to całkowicie nic bym z tego nie zrozumiał...
pozdrawiam

0

Mylisz się, wiedzą dzielę się chętnie ale nie piszę gotowców chyba, że ten gotowiec to jedna linijka, w tym przypadku nie będę pisał całego rozwiązania.

0

Bo gdyby nie te przykłady to całkowicie nic bym z tego nie zrozumiał

Bo jakbys zajrzal do opisu kursorow to bys sie w momencie dowiedzial jak je zastosowac, jak juz bedziesz wiedzial do czego sluza. A same przyklady ich zastosowania sa w dokumentacji (zapewne, bo nie wiadomo czego uzywasz).

0

cos takiego - tylko powiaz sobie jeszcze jakos delted z tym resultsetem

UPDATE czesci
SET data_przeniesienia = GETDATE(),
poprzednie_miejsce = D.aktualne_miejsce,
aktualne_miejsce = K.Nr_ewidencyjny_komputera
FROM DELETED [D], komputery  [K], INSERTED [I]
WHERE K.id_komputera = I.id_komputera 
          AND id_czesci = I.id_czesci 
0

@crowa - ok, tyle że zamiast przecinków joiny z wiadomego powodu.

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