INNER JOIN pomiędzy tabelami bez relacji

0

Witam społeczność,
Mam kłopot. Potrzebuję wyciągnąć pewne dane z dwóch tabel, ale nie ma między nimi utworzonej fizycznie relacji tj. nie ma klucza obcego. Zapytanie, które utworzyłem wygląda tak:

SELECT T.tw_Symbol, T.tw_Opis, OS.ops_ilosc, OS.ops_jm FROM tb_tch_OperacjaSkladnik OS INNER JOIN tw__Towar T ON OS.ops_obid = T.tw_Id WHERE T.tw_Id IN (SELECT ops_obid FROM tb_tch_OperacjaSkladnik WHERE ops_ilosc <> 0 AND ops_op_id = (SELECT op_id FROM tb_tch_Operacja WHERE op_tc_id = (SELECT tc_id FROM tb_tch_Technologia WHERE tc_pd_id = (SELECT pd_id FROM tb_prd_Produkt WHERE pd_tw_id = (SELECT tw_Id FROM tw__Towar WHERE tw_Symbol = '5901548990301')) AND tc_xst_id = 2)));

W tabeli tb_tch_OperacjaSkladnik w polu ops_obid jest przechowywane id towaru z tabeli tw__Towar. Ale nie ma utworzonej w bazie fizycznej relacji pomiędzy tabelami, czyli nie ma klucza obcego. Kiedy usunę połączenie INNER JOIN i pola z tabeli OS, to wtedy bardzo dobrze wybierane są dane zgodnie z tym co chcę. Ale muszę jeszcze mieć dane z pola ops_ilosc, i kiedy takie coś uruchomię, wybiera wszystkie dane z tabeli OS. Jak to ugryźć?

4

żeby joinować nie musisz mieć typowej relacji, czasem robisz joina dodając w zapytaniu kilka warunków/kolumn po których je łączysz i to jest ok.

1

@ehhhhh:

ehhhhh napisał(a):

żeby joinować nie musisz mieć typowej relacji, czasem robisz joina dodając w zapytaniu kilka warunków/kolumn po których je łączysz i to jest ok.

+1

Warto zadać sobie pytanie czy są na pracujacych kolumnach indeksy, bo jeśli nie były w ten sposób przemyślane podczas projektowania, może nie być
Szkolna ćwiczeniowa baza nie poczuje problemu braku indeksów, ale produkcja na 20M rekordów już tak, klęknie.

1

@Buster, dodaj alias do drugiego odwołania tabeli tb_tch_OperacjaSkladnik,

SELECT T.tw_Symbol
	,T.tw_Opis
	,OS.ops_ilosc
	,OS.ops_jm
FROM tb_tch_OperacjaSkladnik OS
INNER JOIN tw__Towar T
	ON OS.ops_obid = T.tw_Id
WHERE T.tw_Id IN (
		SELECT OS2.ops_obid
		FROM tb_tch_OperacjaSkladnik OS2
		WHERE OS2.ops_ilosc <> 0
			AND OS2.ops_op_id = (
				SELECT op_id
				FROM tb_tch_Operacja
				WHERE op_tc_id = (
						SELECT tc_id
						FROM tb_tch_Technologia
						WHERE tc_pd_id = (
								SELECT pd_id
								FROM tb_prd_Produkt
								WHERE pd_tw_id = (
										SELECT tw_Id
										FROM tw__Towar
										WHERE tw_Symbol = '5901548990301'
										)
								)
							AND tc_xst_id = 2
						)
				)
		);
5

straszny potwór z tego zapytania, lepiej wygląda tak:

select t.tw_symbol, t.tw_opis, os.ops_ilosc, os.ops_jm 
from tb_tch_operacjaskladnik os inner join tw__towar t on (os.ops_obid=t.tw_id) 
  inner join tb_tch_operacja o on (os.ops_op_id=o.op_id) 
  inner join tb_tch_technologia tc on (o.op_tc_id=tc.tc_id) 
  inner join tb_prd_produkt p on (tc.tc_pd_id=p.pd_id) 
  inner join tw__towar tp on (p.pd_tw_id=tp.tw_id)
where os.ops_ilosc<>0 and tp.tw_symbol='5901548990301' and tc.tc_xst_id=2
order by t.tw_symbol

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.