Zapytanie SQL z LEFT JOIN

0

Siemanko smile.gif

Mam pewien problem i nie mogę złożyć dobrze zapytania bo co wpisze to błąd

mam tabele dokument_magazynowy

id_dok | rodzaj | id_kontrahent | id_magazyn

zatem robię sobie

SELECT dm.id_dok, dm.rodzaj, dm.id_kontrahent, dm.id_magazyn FROM doument_magazynowy dm
LEFT JOIN kontrahent k ON dm.id_kontrahenta = k.id_kontrahenta
LEFT JOIN magazyn m ON dm.id_magazyn = m.id_magazyn

I na tym poziomie super pobieram sobie kontrahenta do dokumentu oraz magazyn dla dokumentu.

ale do tego zestawu chciałbym pobrać produkty a w tej tabeli dla dokumentu jest to lista kilku pozycji więc nie musi być cała lista wystarczy jeden i tutaj mam tabele pozycje_dokumentu_magazynowego w której jest kilka pozycji

id | id_dok | id_art

oraz tabela artykuły

id_art | id_kat

zależy mi aby wyciągnąć ID z artykułu id_kat

no więc pod : LEFT JOIN magazyn m ON dm.id_magazyn = m.id_magazyn zrobiłem sobie kolejny

LEFT JOIN pozycje_dokumentu_magazynowego pdm ON pdm.id_dok = dm.id_dok
LEFT JOIN artykul a ON a.id_art = pdm.id_art

No ale niestety to mi nie działa , próbowałem robić po LEFT JOIN ( select - ale też bez skutku

Może ktoś podpowie jak to można wykonać - będę wdzięczny za pomoc.

1

Ale co nie działa? Jakiś błąd? Czy zapytanie nie wyświetla danych?

0
Lilpri napisał(a):

Ale co nie działa? Jakiś błąd? Czy zapytanie nie wyświetla danych?

Już mówię ....

przykład :

from dbo.dokument_magazynowy dm
left join dbo.kontrahent k (nolock) on dm.id_kontrahenta = k.id_kontrahenta
left join dbo.magazyn m (nolock) on dm.id_magazynu_docelowego = m.id_magazynu

kiedy dodam ....

		left join dbo.pozycja_dokumentu_magazynowego pdm on dm.id_dok_magazynowego = pdm.id_dok_magazynowego

Otrzymuje:

Ambiguous column name 'id_dok_magazynowego'.

1

Nigdzie w zapytaniu nie masz id_dok_magazynowego, które używasz bez aliasu tabeli? Bo ten błąd na to wskazuje.

0
Lilpri napisał(a):

Nigdzie w zapytaniu nie masz id_dok_magazynowego, które używasz bez aliasu tabeli? Bo ten błąd na to wskazuje.

Już mówię :

Mam select ... from pozycja_dokumentu_magazynowego pdm itd. itd. where ...

ale pod tym mam nowe zapytanie o którym mowa

select .... from where gdzie używam id_dok_magazynowgo where ...

w pierwszy zapytaniu występuje w drugim pod spodem nie występuje dwa razy.

0

Pokarz jakie kolumny wyciągasz w selekcie - bajpeluej wrzuć całe zapytanie.

0
 select 
				 SKU = a.indeks_katalogowy
				,PROD_NAME1 = rtrim(a.nazwa + ' '+ isnull(a.nazwa2,''))
				,NUMBER = poz.ilosc
				,MEAS_UNIT = j.skrot
				,MEAS_UNIT2 = dm.sym_wal_vat
				,MEAS_UNIT2 = ka.id_kategorii
				,FO_CODE = case when (ka.id_kategorii = '18' and dm.sym_wal_vat = 'EUR') then 'AKRII' else '33333' end
			  from (select	 pdm.id_dok_magazynowego
							,case a.rodzaj when 'Produkt' then ap.id_artykulu else a.id_artykulu end as id_artykulu
							,sum(pdm.ilosc * pdm.przelicznik * isnull(dp.ilosc,1) * isnull(dp.przelicznik,1)) as ilosc
					from pozycja_dokumentu_magazynowego pdm
						left join artykul a on pdm.id_artykulu = a.id_artykulu
						left join definicja_produktu dp on a.id_artykulu_prod = dp.id_artykulu
						left join artykul ap on dp.id_skladnika = ap.id_artykulu
					group by 
						pdm.id_dok_magazynowego
						,case a.rodzaj when 'Produkt' then ap.id_artykulu else a.id_artykulu end) poz
				  left join dokument_magazynowy dm on poz.id_dok_magazynowego = dm.id_dok_magazynowego
				  left join kontrahent k on dm.id_kontrahenta = k.id_kontrahenta
				  left join artykul a on poz.id_artykulu = a.id_artykulu
				  left join jednostka j on a.id_jednostki = j.id_jednostki
				  left join kategoria_artykulu ka on a.id_kategorii = ka.id_kategorii

			  where dm.id_dok_magazynowego = 818082


		select 
			 ORDER_NR = 'AKN/'+numer
			,FR_CODE = 'AKN/'+case when dm.rodzaj_dokumentu = 'WZ' then cast(k.id_kontrahenta as varchar(40)) else cast(m.id_magazynu as varchar(40)) end
			,FR_NAME1 = ltrim(rtrim(case when dm.rodzaj_dokumentu = 'WZ' then k.nazwa_pelna else m.nazwa end))
            ,FR_NAME2 = ltrim(rtrim(case when dm.rodzaj_dokumentu = 'WZ' then k.nazwa else m.symbol end))
            ,FR_POST_CODE = ltrim(rtrim(case when dm.rodzaj_dokumentu = 'WZ' then  k.kod_pocztowy else '00-000' end))
            ,FR_CITY = ltrim(rtrim(case when dm.rodzaj_dokumentu = 'WZ' then k.miejscowosc else m.miejsce_wystawienia end))
            ,FR_STREET = case when dm.rodzaj_dokumentu = 'WZ' then k.ulica_lokal else m.lokalizacja end
            ,FR_COUNTRY = case when dm.rodzaj_dokumentu = 'WZ' then k.sym_kraju else 'PL' end
            ,REMARKS1 = isnull(replace(replace(dm.uwagi, char(13), ''), char(10), ''),'')
			,POSITIONS = ''
		from dbo.dokument_magazynowy dm (nolock)
			left join dbo.kontrahent k (nolock) on dm.id_kontrahenta = k.id_kontrahenta
			left join dbo.magazyn m (nolock) on dm.id_magazynu_docelowego = m.id_magazynu
			left join dbo.pozycja_dokumentu_magazynowego pdm on dm.id_dok_magazynowego = pdm.id_dok_magazynowego
			
			
			 

		where id_dok_magazynowego = 818082
0

Tu nie wie, którą kolumnę ma wziąć. Dodaj alias przed tym kluczem
screenshot-20200826122917.png

0
Tomek Pycia napisał(a):

Tu nie wie, którą kolumnę ma wziąć. Dodaj alias przed tym kluczem
screenshot-20200826122917.png

ależ ja się namęczyłem ;) faktycznie tutaj brak aliasu , ale mam w sumie jeszcze ostatni problem ... bo jak pozycji dokumenty mam np, 6 szt on po zapytaniu wyświetla mi 6 wierszy jak mogę ograniczyć do 1 wiersza ?

0

Jak masz pozycje ponumerowane to możesz w WHERE (albo w ON) ograniczyć dla pozycja = 1, jak nie masz takiej kolumny to pozostaje wyciągnąć tylko pierwszy wiersz dla dokumentu a nie wszystkie pozycje. W mssql można użyć TOP 1 (https://stackoverflow.com/questions/2043259/how-to-join-to-first-row).

0
Tomek Pycia napisał(a):

Jak masz pozycje ponumerowane to możesz w WHERE (albo w ON) ograniczyć dla pozycja = 1, jak nie masz takiej kolumny to pozostaje wyciągnąć tylko pierwszy wiersz dla dokumentu a nie wszystkie pozycje. W mssql można użyć TOP 1 (https://stackoverflow.com/questions/2043259/how-to-join-to-first-row).

Bardzo bardzo Ci dziękuje za pomoc :) wszystko działa jak być powinno

1
Daniel Winiarczyk napisał(a):
Tomek Pycia napisał(a):

Tu nie wie, którą kolumnę ma wziąć. Dodaj alias przed tym kluczem
screenshot-20200826122917.png

ależ ja się namęczyłem ;) faktycznie tutaj brak aliasu , ale mam w sumie jeszcze ostatni problem ... bo jak pozycji dokumenty mam np, 6 szt on po zapytaniu wyświetla mi 6 wierszy jak mogę ograniczyć do 1 wiersza ?

LIMIT 1 dodane na końcu zapytania również rozwiąże ten problem, słowo kluczowe, które warto zapamiętać.

1
dawid.wiklo4 napisał(a):
Daniel Winiarczyk napisał(a):
Tomek Pycia napisał(a):

Tu nie wie, którą kolumnę ma wziąć. Dodaj alias przed tym kluczem
screenshot-20200826122917.png

ależ ja się namęczyłem ;) faktycznie tutaj brak aliasu , ale mam w sumie jeszcze ostatni problem ... bo jak pozycji dokumenty mam np, 6 szt on po zapytaniu wyświetla mi 6 wierszy jak mogę ograniczyć do 1 wiersza ?

LIMIT 1 dodane na końcu zapytania również rozwiąże ten problem, słowo kluczowe, które warto zapamiętać.

LIMIT nie działał użyłem TOP 1

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