Jak najwydajniej =?ISO-8859-2?Q?skonstruowa=E6_selecta=3F?=
Johnny - 08-03-2007 00:02
Jak najwydajniej =?ISO-8859-2?Q?skonstruowa=E6_selecta=3F?=
Istnieje dajmy na to tabela osoby o polach: id, od, do, nazwisko oraz tabela wypożyczenie o polach: od, do, id_osoby, id_przedmiotu.
W tabeli wypożyczenie jest zapis: 2007-02-01, 2007-02-28, 1, 123 w tabeli osoby są dwa rekordy (odnoszą się do tej samej osoby): 2007-01-01,2007-02-03, 1, Kowalska 2007-02-04,9999-12-31, 1, Kowalska-Nowa i teraz chodzi o to by zrobić selecta, który zwróci rekordy wypożyczeń o strukturze: nazwisko,id_przemiotu z okresu od 2007-02-01 do 2007-02-28 i by w przypadku, gdy złączenie zwróci dwa rekordy osoby, pojawiły siędane najbardziej aktualne, czyli: Kowalska-Nowak,123
Jak to najwydajniej napisać? Oczywiście rozwiązania typu top 1 + odpowiednie sortowanie odpada ponieważ przykład jest uproszczony, a rzeczywista tabela osób może zawierać wiele tego typu rekordów.
-- Pozdrawiam Johnny
"Zauważyłem że ci wszyscy, którzy opowiadają się za aborcją, zdążyli się urodzić". R. Reagan
Borafu - 08-03-2007 00:02
Johnny napisał(a): > Istnieje dajmy na to tabela osoby o polach: id, od, do, nazwisko oraz > tabela wypożyczenie o polach: od, do, id_osoby, id_przedmiotu. Tu masz "od", tam masz "od", tu masz "do", tam masz "do"... Czym się różni jedno "do" od drugiego "do"?
> Jak to najwydajniej napisać? Zacznij od tego jaka to baza.
Pozdro -- Borafu
Johnny - 08-03-2007 00:02
Borafu napisał(a): > Johnny napisał(a): >> Istnieje dajmy na to tabela osoby o polach: id, od, do, nazwisko oraz >> tabela wypożyczenie o polach: od, do, id_osoby, id_przedmiotu. > Tu masz "od", tam masz "od", tu masz "do", tam masz "do"... > Czym się różni jedno "do" od drugiego "do"? > >> Jak to najwydajniej napisać? > Zacznij od tego jaka to baza. > > Pozdro
MS SQL; struktura jest mi dana i nie mogę jej zmienić. Od, do w tabeli osoby określa zakres obowiązywania danych personalnych, które mogąsię zmienić (ślub, zmiana miejsca zamieszkania, itp.) Od, do w tabeli wypożyczenia określa okres wypożyczenia czegoś.
Oczywiście jest to przykład obrazujący jedynie mój rzeczywisty problem.
-- Pozdrawiam Johnny
"Zauważyłem że ci wszyscy, którzy opowiadają się za aborcją, zdążyli się urodzić". R. Reagan
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 08-03-2007 00:02
Johnny wrote: > struktura jest mi dana i nie mogę jej zmienić. [...] > Oczywiście jest to przykład obrazujący jedynie mój rzeczywisty problem.
Krótko mówiąc pytasz o poradę w sprawie innego problemu, a w dodatku z góry wykluczasz prawdopodobnie najlepsze rozwiązanie tego innego problemu (polegające na dodaniu flagi aktualne/nieaktualne, jak to się zwykle robi dla danych o określonym czasie ważności). To co właściwie chcesz osiągnąć tym pytaniem? Gdybyś pytał jak w ogóle to zrobić, to jeszcze ok, ale odpowiedź na pytanie "jak to zrobić najwydajniej" może zależeć od wielu czynników, których nie podałeś opisując ten "analogiczny" problem...
-- Michał Kuratczyk
Bartek Dajewski - 08-03-2007 00:02
=?iso-8859-2?Q?Re:_Jak_najwydajniej_skonstruowa=E6_selecta=3F ?=
Cześć.
Użytkownik "Johnny" <johnny_bez_spamu_@klub.chip.pl> napisał w wiadomości news:esmjil$qih$1@atlantis.news.tpi.pl... [...] >Jak to najwydajniej napisać? Oczywiście rozwiązania typu top 1 + >odpowiednie sortowanie odpada ponieważ przykład jest uproszczony, a >rzeczywista tabela osób może zawierać wiele tego typu rekordów. [...] >struktura jest mi dana i nie mogę jej zmienić
W takim razie jedyną inną niż sort+top możliwość widzę w napisaniu własnej funkcji, która zwróci aktualne dane. Nie wiem na ile zauważalna będzie różnica, ale pewne potencjalne źródło zysku w tym jest: sortowanie zestawu rekordów wymaga więcej czasu niż ich jednokrotne przejrzenie i odnalezienie właściwej wartości. Raz byłem zmuszony do zastosowania podobnego rozwiązania i opłaciło się, jednak mogłem tę funkcję do bazy dołożyć. Jeśli natomiast niemożność zmiany struktury oznacza u Ciebie również, że nie można dopisać czegokolwiek nowego (czyli np. funkcji), to można jeszcze stworzyć własną bazę i w niej funkcję odwołującą się do tabel z bazy głównej. Czy to ma w ogóle jakikolwiek sens? Nie wiem. Trzeba by spróbować obydwu rozwiązań, porównać wyniki i zastanowić się czy zysk jest wart tej niemałej komplikacji.
-- Pozdrawiam :-) Bartek
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 08-03-2007 00:02
Johnny wrote: > Istnieje dajmy na to tabela osoby o polach: id, od, do, nazwisko oraz > tabela wypożyczenie o polach: od, do, id_osoby, id_przedmiotu. > > W tabeli wypożyczenie jest zapis: > 2007-02-01, 2007-02-28, 1, 123 > w tabeli osoby są dwa rekordy (odnoszą się do tej samej osoby): > 2007-01-01,2007-02-03, 1, Kowalska > 2007-02-04,9999-12-31, 1, Kowalska-Nowa > i teraz chodzi o to by zrobić selecta, który zwróci rekordy wypożyczeń o > strukturze: > nazwisko,id_przemiotu z okresu od 2007-02-01 do 2007-02-28 i by w > przypadku, gdy złączenie zwróci dwa rekordy osoby, pojawiły się dane > najbardziej aktualne, czyli: > Kowalska-Nowak,123 > > Jak to najwydajniej napisać? Oczywiście rozwiązania typu top 1 + > odpowiednie sortowanie odpada ponieważ przykład jest uproszczony, a > rzeczywista tabela osób może zawierać wiele tego typu rekordów. >
Z najnowszym sobie nie poradzisz, ale ten system ma pewnie kilka założeń na temat tych okresów. I przy pewnych założeniach zadziała takie bardzo proste zapytanie:
select * from osoby o, wypozyczenia w where o.id = w.id_osoby and w.do between o.od and o.do
-- P.M.
johnny - 08-03-2007 00:02
> select * > from osoby o, wypozyczenia w > where o.id = w.id_osoby > and w.do between o.od and o.do >
Bingo! Jak mogłem na to nie wpaść? Jeszcze to jutro sprawdzę ale już na "sucho" widać, że to powinno zadziałać.
Wielkie dzięki przedpiścom i Tobie oczywiście.
-- Pozdrawiam Johnny
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
=?UTF-8?Q?=5Bmysql=5D_jak_pobra=C4=87_warto=C5=9B=C4=87_ AUTO=5F?==?UTF-8?Q?INCREMENT=3F?=
Konwesja znaków w dump'ie bazy danych - ISO -> utf-8 -> ISO -> utf-8
=?iso-8859-2?q?Co_oznacza_b=B3=B1d_Warning:_mysql=5Fconnect() _[function.mysql-connect]:_Can't_connect_to_local_MySQL_server_through_sock et_'/var/run/mysqld/mysqld.sock'_(2)_in?=
=?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?=
[MS SQL 2005] =?windows-1250?Q?Ilo=9C=E6_wiersz=F3w_w_zbiorze_wynikowym?=
zanotowane.pldoc.pisz.plpdf.pisz.pllubiatowo.xlx.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 |
|