Witam społeczność, Jakoś nie mogę sobie poradzić z tematem.
Otóż. Muszę wykonać UPDATE na kilku rekordach, wartościami, które wyciągam z innej tabeli? Da się to jakoś ogarnąć jednym zapytaniem? Uściślając. Wyciągam listę danych (jedno pole), a następnie tą listą chcę uaktualnić odpowiednie pole w innej tabeli w kilku rekordach. Obydwie tabele są ze sobą powiązane. Baza danych SQL Server.
Możesz spróbować tak
with d as (
select * from mytable where id = 1
)
update mytable2
set SomeColumn = d.Value,
SomeColumn2 = d.Value2
where SomeColumnWhere = d.ValueWhere
Albo pokaż, o co dokładnie ci się rozchodzi, bo może to się da jednym zapytaniem zrobić
To po kolei. Dokładnie chodzi o bazę Subiekta GT. Muszę na pozycjach dokumentu w tabeli dok_Pozycja wpisać kody CN, które są w tabeli z towarami tw__Towar. Ale jako, że jest to dokument zbiorczy, to składa się z kilkunastu dokumentów WZ i to dokładnie o to chodzi. Listę pozycji do uzupełnienia, oraz id towarów wyciągam takim zapytaniem:
SELECT ob_Id, ob_TowId FROM dok_Pozycja WHERE ob_TowKodCN = '' AND ob_DokMagId IN (SELECT dok_Id FROM dok__Dokument WHERE dok_DoDokId = (SELECT dok_Id FROM dok__Dokument WHERE dok_NrPelny = 'Nr faktury zbiorczej'));
Kody CN z tabeli tw__Towar dla pozycji powyżej wyciągnąć bym chciał takim zapytaniem:
SELECT tw_KodTowaru FROM tw__Towar WHERE tw_Id IN (Zapytanie powyżej z usuniętym polem ob_Id);
I teraz jak to połączyć razem do kupy z zapytaniem UPDATE??
Intelektualnie możesz się zmagać z zagadnieniem jako select z perspektywy tej tabeli (i tego wyboru wierszy), w której będzie finalny update.
jesli opanujesz
select {ta tabela}.pole, {inne}.pole2 join {inne}
i zobaczysz w SQL Studio to, co zamierzasz: pola oryginalne, i przyszłe wartości jakie maja być, ilość wierszy zgodna itd...
to jesteś prawie w domu do update pole = pole2
update p set ob_TowKodCN=t.tw_KodTowaru from dok_Pozycja p inner join tw__Towar t on (p.ob_TowId=t.tw_Id) where t.ob_TowKodCN='' and t.ob_DokMagId in (select dok_Id from dok__Dokument where dok_DoDokId in (select dok_Id from dok__Dokument where dok_NrPelny='Nr faktury zbiorczej'))
--WERYFIKACJA
SELECT dp.ob_Id, ob_TowId, dp.ob_TowKodCN, tt.tw_KodTowaru
FROM dok_Pozycja dp
JOIN tw__Towar tt ON tt.tw_id = dp.ob_TowId
WHERE ob_TowKodCN = ''
AND ob_DokMagId IN (SELECT dok_Id FROM dok__Dokument WHERE dok_DoDokId = (SELECT dok_Id FROM dok__Dokument WHERE dok_NrPelny = 'Nr faktury zbiorczej'))
--POPRAWA DANYCH
UPDATE dp
SET dp.ob_TowKodCN = tt.tw_KodTowaru
FROM dok_Pozycja dp
JOIN tw__Towar tt ON tt.tw_id = dp.ob_TowId
WHERE ob_TowKodCN = ''
AND ob_DokMagId IN (SELECT dok_Id FROM dok__Dokument WHERE dok_DoDokId = (SELECT dok_Id FROM dok__Dokument WHERE dok_NrPelny = 'Nr faktury zbiorczej'))
Edit: spóźniłem się :)
A gdzie tutaj jest UPDATE?????
Fac napisał(a):
--WERYFIKACJA SELECT dp.ob_Id, ob_TowId, dp.ob_TowKodCN, tt.tw_KodTowaru FROM dok_Pozycja dp JOIN tw__Towar tt ON tt.tw_id = dp.ob_TowId WHERE ob_TowKodCN = '' AND ob_DokMagId IN (SELECT dok_Id FROM dok__Dokument WHERE dok_DoDokId = (SELECT dok_Id FROM dok__Dokument WHERE dok_NrPelny = 'Nr faktury zbiorczej')) --POPRAWA DANYCH SELECT dp.ob_Id, ob_TowId, dp.ob_TowKodCN, tt.tw_KodTowaru FROM dok_Pozycja dp JOIN tw__Towar tt ON tt.tw_id = dp.ob_TowId WHERE ob_TowKodCN = '' AND ob_DokMagId IN (SELECT dok_Id FROM dok__Dokument WHERE dok_DoDokId = (SELECT dok_Id FROM dok__Dokument WHERE dok_NrPelny = 'Nr faktury zbiorczej'))
Edit: spóźniłem się :)