zapytanie update wykorzystujące select z innej tabieli

0

Witam. Mam do wykonania takie zapytanie, które zmieni określone rekordy z jednej tabeli na podstawie wyciągniętych danych z innej tabeli. Slinik Firebird.
Wygląda ono tak:

update sys_rozrach2020  r
set r.konto = (select k.numer
              from fk_konta2020 k
              where k.numer like '201010010%'  and char_length (k.numer) > 9 and k.numer = r.konto)
where r.konto like '201010001%' and char_length (r.konto) > 9;

I teraz nie mogę wykonać tego zapytania, bo wyświetla się taki komunikat:

can't format message 13:375 -- message file C:\WINDOWS\firebird.msg not found.
validation error for column "SYS_ROZRACH2020"."KONTO", value "*** null ***".

Proszę o pomoc w rozwiązaniu, co jest nie tak w tym zapytaniu

2

Sprawdzałeś, co cie ten select zwraca. Może dostajesz null dla jakiś rekordów a w bazie masz checka na kolumnie r.konto ze nie moze być nullem.

1

Dodatkowo upewnij się że ten select zawsze zwraca tylko jedną wartość

0
Tomek Pycia napisał(a):

Sprawdzałeś, co cie ten select zwraca. Może dostajesz null dla jakiś rekordów a w bazie masz checka na kolumnie r.konto ze nie moze być nullem.

Samo to podzapytanie

select k.numer
from fk_konta2020 k
where k.numer like '201010010%'  and char_length (k.numer) > 9 and k.numer = r.konto;

też nie zwraca żadnych wyników, bo taki komunikat się pojawia:

can't format message 13:794 -- message file C:\WINDOWS\firebird.msg not found.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
R.KONTO.
At line 3, column 94.

Czyli bez Join'a zapytanie nie zna takiego pola.

0
biela_ napisał(a):

Dodatkowo upewnij się że ten select zawsze zwraca tylko jedną wartość

Samo podzapytanie napisanie bez tego "and k.numer = r.konto", czyli tak:


select k.numer
from fk_konta2020 k
where k.numer like '201010010%'  and char_length (k.numer) > 9;


zwraca mi wiele wyników:

screenshot-20200624134913.png

To może być przyczyna??

0
select k.numer, r.konto from  fk_konta2020  r outer left join  sys_rozrach2020 k  on (k.numer = r.konto) where k.numer like '201010010%'  and char_length (k.numer) > 9 and r.konto like '201010001%' and char_length (r.konto) > 9

Takie coś ci powinno zwrócić konta z tabeli sys_rozrach2020 które nie mają przystającego rekordu w tabeli fk_konta2020

0

To podzapytanie nie zwraca żadnego nulla

select k.numer
from fk_konta2020 k
where k.numer like '201010010%'  and char_length (k.numer) > 9;

Jednak nie napisałem chyba najważniejszego, co chyba ma duże znaczenie.
Dane w tabeli sys_rozrach2020 oraz fk_konta2020 nie są takie same. W tabeli fk_konta2020 właśnie w zakresie


where k.numer like '201010001%'  and char_length (k.numer) > 9

musiałem dodać jeden znak w k.numer i konto k.numer wygląda tak, że dodałem jedno zero na czwartym miejscu od końca. Natomiast r.konto z tabeli sys_rozrach2020 nie ma tego zera. Dlatego taki select nie zwraca żadnych wyników:

select r.konto
from sys_rozrach2020 r
where  r.konto in
                        (select k.numer
                        from fk_konta2020 k
                        where k.numer like '201010010%'  and char_length (k.numer) > 9);

Zatem również to zapytanie nie zwraca żadnych wyników:

select K.NUMER, R.KONTO
from FK_KONTA2020 k
left outer join SYS_ROZRACH2020 r on (K.NUMER = R.KONTO)
where K.NUMER like '201010010%' and
      char_length(K.NUMER) > 9   and r.konto like '201010001%' and char_length (r.konto) > 9

Jak zatem napisać takiego update'a, który zmieni r.konto z tabeli sys_rozrach2020, bo takie zapytanie nie działą:

update sys_rozrach2020 r
set r.konto =
                        (select k.numer
                        from fk_konta2020 k
                        where k.numer like '201010010%'  and char_length (k.numer) > 9)
where r.konto like '201010010%'  and char_length (r.konto) > 9;

bo pojawia się komunikat:
can't format message 13:189 -- message file C:\WINDOWS\firebird.msg not found.
multiple rows in singleton select.

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