sql, zapytanie zagnieżdzone

0

Chciałabym wyświetlić:
produkt_nazwa | składowa tak, abym widziała również składowe półproduktów
produkt_nazwa | skladowa
produkt1 | surowiec1
produkt1 | opakowanie1
produkt1 | polprodukt1
polprodukt1 | surowiec4

select p.produkt_nazwa, s.skladowa
from produkty p
	join skladowe s on p.produkt_nazwa=s.produkt_nazwa
where p.id=1

mam takie tabele:
tabela PRODUKTY
id | produkt_nazwa	| kod		
01 | produkt1		| p-a-01	
02 | produkt2		| p-a-02	
03 | produkt3		| p-b-03	
04 | polprodukt1	| p-e-01

tabela SKLADOWE
produkt_nazwa| kod | skladowa
produkt1	    | p-a-01	| surowiec1
produkt1	    | p-a-01	| opakowanie1
produkt1	    | p-a-01	| polprodukt1
polprodukt1 | p-e-01	| surowiec4
produkt2	    | p-a-02	| surowiec1
0

Na pewno przydałoby Ci się jakieś ID zamiast poleganie na nazwach w tabelce SKLADOWE, ale zasadniczo Twój kod działa... wywal tylko where p.id = 1.
Mam takie chytre podejrzenie, że albo nie jesteś autorem tego zapytania albo po prostu masz chwilę zaćmienia...

dosłownie:

SELECT p.produkt_nazwa, s.skladowa
FROM PRODUKTY p
JOIN SKLADOWE s
ON p.produkt_nazwa = s.produkt_nazwa

powinno zrobić robotę...

0

Musiałam nie jasno napisać co chcę otrzymać. W zapytaniu chcę otrzymać wyniki dla wskazanego id produktu np 1. Tak aby były składowe produktu oraz gdy produkt posiada półprodukt, który ma swoje składowe również były widoczne.
W wyniku mam wiedzieć ile potrzebuję surowców, opakowań do wyprodukowania produktu.

Aktualnie zapytanie wyświetli mi składowe bez składowych półproduktu.

0

nie odpowiem bo nie wiem, ale poszukaj może pod hasłem recursive join

0

Szukaj RECURSIVE CTE

0

jaki silnik?

0

w oracle można użyć list_agg do wskazania wszystkich "składników" po przecinku i connection by do joinowania po tej samej tabeli :)

0

Microsoft SQL Server

0

wersja 14.0.3192.2
windows serwer 2016 std

1

No to rekurencyjnie, gmatwajac Twój przyklad, tak, że produkt1 składa się z dwóch pólproduktów połproduktów, z czego jeden pół produkt ma kolejny:

id produkt_nazwa kod
1 produkt1 p-a-01
2 produkt2 p-a-02
3 produkt3 p-b-03
4 polprodukt1 p-e-01
4 polprodukt1.1 p-b-01
4 polprodukt2 p-b-01
produkt_nazwa kod skladowa
produkt1 p-a-01 surowiec1
produkt1 p-a-01 opakowanie1
produkt1 p-a-01 polprodukt1
polprodukt1 p-e-01 surowiec4
polprodukt1 p-e-01 polprodukt1.1
polprodukt1.1 p-e-01 surowiec1.1
polprodukt1.1 p-e-01 polprodukt2
polprodukt2 p-a-02 spolprodukt2

Zapytanie:

declare @produkt varchar(20)
set @produkt='produkt1'
;with dane as (
select 
	s.*
	,p.produkt_nazwa parent 
from 
	skladowe s
	left join produkty p on p.produkt_nazwa = s.skladowa
	),
wynik as (
select 
	*
from 
	dane as t 
where 
	produkt_nazwa=@produkt
UNION ALL
select 
	t.*
from 
	dane as t 
    join wynik on t.produkt_nazwa = wynik.parent)
/*WARUNUNEK DO ODSIANIA Z WYNIKU SKŁADOWYCH BEDĄCYCH PRODUKTAMI
where parent is null
*/
select * from wynik

Zwróci:

produkt_nazwa kod skladowa parent
produkt1 p-a-01 surowiec1
produkt1 p-a-01 opakowanie1
produkt1 p-a-01 polprodukt1 polprodukt1
polprodukt1 p-e-01 surowiec4
polprodukt1 p-e-01 polprodukt1.1 polprodukt1.1
polprodukt1.1 p-e-01 surowiec1.1
polprodukt1.1 p-e-01 polprodukt2 polprodukt2
polprodukt2 p-a-02 spolprodukt2

http://sqlfiddle.com/#!18/a0aa7/1

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