=?iso-8859-2?q?Z=B3=B1czenie_trzech_tabel?=
adam - 01-07-2006 00:57
=?iso-8859-2?q?Z=B3=B1czenie_trzech_tabel?=
Witam, mam problem z jednym zapytaniem. W miare mozliwosci prosilbym o pomoc. Przedstawie sytuacje: Serwer MSSQL 2000 3 tabele:
slownik_kodow: (28000 pozycji) nazwa cecha1 cecha2 cecha3 cecha4 cecha5
przypisanie_do_magazynów: (59000 pozycji) cecha1 cecha2 magazyn ilosc_na_danym_magazynie
licz: (przyrastajaca, na razie 20 pozycji) magazyn cecha1 cecha2 ilosc_rzeczywista
(tabele mozna laczyc poprzez pola cecha1 i cecha2)
i chodzi mi o to zeby uzyskac zestawienie wszystkich 28000 pozycji w postaci: cecha1 cecha2 nazwa ilosc_rzeczywista ilosc_na_danym_magazynie
podajac numer magazynu
najprostsze zapytanie jakie mi przychodzi do glowy ma postac: SELECT t1.cecha1, t1.cecha2, t1.nazwa, (select JEST from t3 where t3.cecha1 = t1.cecha1 and t3.cecha2 = t1.cecha2 and t3.mag = '1'
) as JEST, (select t3.ma_byc from t3 a where t3.MAG_ID = '1' and t1.KOD_TOWARU = t3.PROD_ID and t1.KOD_ROZMIARU = t3.TAIL_ID ) as MA_BYC
FROM t1
i takie zapytanie jak najardziej działa, dostaje liste wszystkich pozycji z wpisanymi w kolumnach (jest, ma_byc) wartosciami Null bądz wlasciwymi ilosciami. Tyle ze zestawienie trwa długo, czasami zbyt dlugo, gdybym chcial dostac tylko rekordy gdzie JEST > 0 to musze podstawiac taki warunek: where (select JEST from t3 where t3.cecha1 = t1.cecha1 and t3.cecha2 = t1.cecha2 and t3.mag = '1'
) > 0
nie wyglada to najladniej (chociaz ladnie wygladac nie musi, ma dzialac)
Moze ktos ma lepszy pomysł na rozwiazanie tego zagadnienia?
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 02-07-2006 00:14
adam wrote: > > najprostsze zapytanie jakie mi przychodzi do glowy ma postac: > SELECT t1.cecha1, > t1.cecha2, > t1.nazwa, > (select JEST from t3 > where > t3.cecha1 = t1.cecha1 and > t3.cecha2 = t1.cecha2 and > t3.mag = '1' > > ) as JEST, > (select t3.ma_byc from t3 a > where > t3.MAG_ID = '1' and > t1.KOD_TOWARU = t3.PROD_ID and > t1.KOD_ROZMIARU = t3.TAIL_ID > ) as MA_BYC > > FROM t1 > > > i takie zapytanie jak najardziej działa, dostaje liste wszystkich > pozycji z wpisanymi w kolumnach (jest, ma_byc) wartosciami Null bądz > wlasciwymi ilosciami. Tyle ze zestawienie trwa długo, czasami zbyt > dlugo, gdybym chcial dostac tylko rekordy gdzie JEST > 0 to musze > podstawiac taki warunek: > where > (select JEST from t3 > where > t3.cecha1 = t1.cecha1 and > t3.cecha2 = t1.cecha2 and > t3.mag = '1' > > ) > 0 > > nie wyglada to najladniej (chociaz ladnie wygladac nie musi, ma > dzialac) > > Moze ktos ma lepszy pomysł na rozwiazanie tego zagadnienia?
Pierwsza zasada, unikaj subselektów wszędzie poza from (i ewentualnie where ... in (select....) )! Po drugie, czemu nazwy w Twoich zapytaniach nie odpowiadają nazwom ze struktury, Po trzecie, to Twoje zapytanie realizuje się przy pomocy zwykłego LEFT JOIN.
-- P.M.
adam - 02-07-2006 00:14
=?iso-8859-2?q?Re:_Z=B3=B1czenie_trzech_tabel?=
Paweł Matejski napisał(a):
> Pierwsza zasada, unikaj subselektów wszędzie poza from (i ewentualnie > where ... in (select....) )! > Po drugie, czemu nazwy w Twoich zapytaniach nie odpowiadają nazwom ze > struktury, > Po trzecie, to Twoje zapytanie realizuje się przy pomocy zwykłego LEFT JOIN.
Przepraszam, walnalem sie przy przepisywaniu: zapytanie zwracajace wynik o ktory mi chodzi wyglada tak: SELECT slownik_kodow.cecha1, slownik_kodow.cecha2, slownik_kodow.nazwa, (select JEST from licz where licz.cecha1 = slownik_kodow.cecha1 and licz.cecha2 = slownik_kodow.cecha2 and licz.mag = '1'
) as JEST, (select przypisanie_do_magazynów.ma_byc from przypisanie_do_magazynów where przypisanie_do_magazynów.mag = '1' and slownik_kodow.cecha1 = przypisanie_do_magazynów.cecha1 and slownik_kodow.cecha2 = przypisanie_do_magazynów.cecha2 ) as MA_BYC
FROM slownik_kodow
oczywiscie w tabeli przypisanie_do_magazynów sa osobne pary cecha1, cecha2 z rozna wartoscia ma_byc dla roznych pozycji mag i tak samo z tabela slownik_kodow.
Zasady znam ale ta postac zapytania jest jedyną ktora mi działa poprawnie. Jak to zrobic na LEFT JOIN?
adam - 02-07-2006 00:14
=?iso-8859-2?q?Re:_Z=B3=B1czenie_trzech_tabel?=
OK. Poradzilem sobie. Miales racje, tylko mnie juz czache przegrzalo i nie pomyslalem o tym. Z 30 sekund wykonywania skryptu zszedlem do 2 :)
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Wydajność baz danych w zależności od poziomu izolacji ANSI/ISO
Czy zna (obsługuje) ktoś program Iso Draw ?
MYSQL - kodowanie w ISO-PL
strona plus baza w iso do utf-8
Kodowanie: z iso na utf
Konwesja znaków w dump'ie bazy danych - ISO -> utf-8 -> ISO -> utf-8
=?iso-8859-2?q?Informatyka,_Java,_EJB,_Ajax,_Spring=2E_Czy=BF by_to_koniec_=B6wiata,_czy_te=BF_nasze_uczelnie_b= EAd=B1_uczy=B3y_w_ko=F1cu!_czego_praktycznego_=2E= 2E=2E=2E?=
=?iso-8859-2?q?Ati_Mobility_Radeon_X300_W_Notebooku_Jak_Zwi=E Akszy=E6_Ilo=B6=E6_Grafiki_Poprzez_Wsp=F3=B3dziele nie_Z_Ramu=3F=3F=3F?=
=?ISO-8859-2?Q?=AFegnam_si=EA=2E=2E=2E?=
Manager =?ISO-8859-2?Q?font=F3w=2E=2E=2E?=
zanotowane.pldoc.pisz.plpdf.pisz.plshutter.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|