Prosze o pomoc w skonstruowaniu zapytania SQL
Norbert - 19-07-2006 00:45
Prosze o pomoc w skonstruowaniu zapytania SQL
Witam
jest sobie tabelka cech (w uproszczeniu) typ cechy - kol_1, wartosc cechy - kol_2 identyfikator wlasciciela cechy - id, np.
| id | kol_1 | kol_2|
| 1 | 'A' | '30' | | 1 | 'B' | 'K' | | 1 | 'C' | '185'| | 2 | 'A' | '30' | | 2 | 'B' | 'M' | | 2 | 'C' | '182'|
Jak zadać zapytanie które pokaże:
wszystkie id, których cecha 'A' ma wartosc '30' i jednocześnie cecha 'B' ma wartość 'K'.
Potrzebuję się tak zapytać w Postgresie i MSSQL'u i powiem szczerze że nie mam koncepcji, a może to już zmęczenie.
Z góry dzięki za pomoc
Pozdrawiam
Norbert
Jacek Stawicki - 19-07-2006 00:45
Użytkownik "Norbert" <norbertn_at_post.pl.i.dont.like.sp_a_m> napisał w wiadomości news:44bd13ff$1@news.home.net.pl... > Witam > > jest sobie tabelka cech (w uproszczeniu) > typ cechy - kol_1, > wartosc cechy - kol_2 > identyfikator wlasciciela cechy - id, np. > > | id | kol_1 | kol_2| > > | 1 | 'A' | '30' | > | 1 | 'B' | 'K' | > | 1 | 'C' | '185'| > | 2 | 'A' | '30' | > | 2 | 'B' | 'M' | > | 2 | 'C' | '182'| > > > Jak zadać zapytanie które pokaże: > > wszystkie id, których cecha 'A' ma wartosc '30' i jednocześnie cecha 'B' > ma wartość 'K'.
select distinct id from tab t1 inner join tab t2 on t1.id=t2.id where t1.kol_1='A' and t1.kol_1='30' and t2.kol_1='B' and t2.kol_1='K'
Norbert - 19-07-2006 00:45
"Jacek Stawicki" <jstawik@gazeta.pl> wrote in message news:e9j4qg$dff$1@inews.gazeta.pl... >> Jak zadać zapytanie które pokaże: >> >> wszystkie id, których cecha 'A' ma wartosc '30' i jednocześnie cecha 'B' >> ma wartość 'K'. > > > select distinct id from tab t1 inner join tab t2 on t1.id=t2.id > where > t1.kol_1='A' and t1.kol_1='30' > and > t2.kol_1='B' and t2.kol_1='K' >
Wielkie dzięki za szybką odpowiedź ! Czy masz może pomysł jak to zapytanie przekształcić aby uniwersalnie obslugiwalo "n" cech? Nie chciałbym budować n-krotnego joina
Pozrawiam
Norbert
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 19-07-2006 00:45
"Norbert" <norbertn_at_post.pl.i.dont.like.sp_a_m> wrote: > Czy masz może pomysł jak to zapytanie przekształcić aby uniwersalnie > obslugiwalo "n" cech? Naprawdę nie można do archiwum zajrzeć?
http://www.depesz.com/index.php/2006...na-lista-cech/
-- Michał Kuratczyk
Norbert - 19-07-2006 00:45
"Michał Kuratczyk" <kura@lj.pl> wrote in message news:e9jakg$6o6$1@mx1.internetia.pl... > Naprawdę nie można do archiwum zajrzeć? > http://www.depesz.com/index.php/2006...na-lista-cech/
Michał bardzo Ci dziękuję :-)
Pozwól jednak na słowo komentarza Zanim zadam zapytanie na grupie przeszukuję google, archiwa, itp. Nie znalazłem tej informacji, może źle szukałem, ale nie znalazłem, dlatego pytam, a od tego chyba są grupy.
Pozdrawiam
Norbert
Norbert - 19-07-2006 00:45
"Norbert" <norbertn_at_post.pl.i.dont.like.sp_a_m> wrote in message news:44bd1ada@news.home.net.pl... > > "Jacek Stawicki" <jstawik@gazeta.pl> wrote in message > news:e9j4qg$dff$1@inews.gazeta.pl... >>> Jak zadać zapytanie które pokaże: >>> >>> wszystkie id, których cecha 'A' ma wartosc '30' i jednocześnie cecha 'B' >>> ma wartość 'K'. >> >> >> select distinct id from tab t1 inner join tab t2 on t1.id=t2.id >> where >> t1.kol_1='A' and t1.kol_1='30' >> and >> t2.kol_1='B' and t2.kol_1='K' >>
Jacku,
Podana przez Ciebie metoda jest dobra dla małej ilości rekordów i cech. Gdy wygenerowałem w bazie testowo 20tys wierszy, to zapytanie dla 2 cech zajęło >300 sekund na postgresie 8 i notebooku z PIV :-). Jak postgres cos sobie przemielil ten czas spadl do 30 sekund. Nie probowalem jednak dla wiekszej ilosci cech, obawiam sie ze czas odpowiedzi bylby strasznie dlugi.
Wg moich aktualnych badań najbardziej optymalną jest metoda podana przez Depesza, a przytoczona przez Michała w poniższych postach. Najważniejsze że wzrost liczby badanych cech prawie nie wpływa na czas przetwarzania zapytania.
select i_id from aaa where (s_typ='wiek' and s_wartosc='30') OR (s_typ='wzrost' and s_wartosc = '178') OR (s_typ='waga' and s_wartosc='20')
group by i_id having count(*) = 3;
Pozdrawiam
Norbert
Jacek Stawicki - 19-07-2006 00:45
Użytkownik "Norbert" <norbertn_at_post.pl.i.dont.like.sp_a_m> napisał w wiadomości news:44bd31c2$1@news.home.net.pl...
> Jacku, > > Podana przez Ciebie metoda jest dobra dla małej ilości rekordów i cech.
nie przecze ;) zapytanie budujemy pod konkretne zalozenie. nie znalem calosci zalozenia :)
pozdrowienia
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
jak to =?ISO-8859-2?Q?zrobi=E6=2E=2E=2E=3F_TSQL_sql_server?==?ISO-8859-2?Q?_?=
Jak =?windows-1250?Q?pobra=E6_szacowan=B9_wielko=9C=E6_zbiory_wy nikowego_w_MS?==?windows-1250?Q?_SQL_2005=3F?=
=?iso-8859-2?Q?=5BMS_SQL=5D_Czy_mo=BFna_wywo=B3a=E6_funkcje_t ylko_raz_dla?==?iso-8859-2?Q?_ca=B3ego_zbioru_=BCr=F3d=B3owego=3F?=
[MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?=
=?ISO-8859-2?Q?k=B3opot_z_uruchomieniem_MY_SQL_dla_C?==?ISO-8859-2?Q?MS_i_CRM_na_Fedora_Core_3?=
Oracle PL/SQL Wstawianie =?ISO-8859-2?Q?wynik=F3w_kolekcji_d?==?ISO-8859-2?Q?o_tabeli?=
[MSSQL] ACCESS - SQL =?ISO-8859-2?Q?B=B3ad_w_konwersji_lic?==?ISO-8859-2?Q?zb?=
[Oracle PL/SQL] Cursor i zapis =?ISO-8859-2?Q?rekord=F3w_do_?==?ISO-8859-2?Q?kolejnych_plik=F3w?=
=?iso-8859-2?Q?=5BMySQL=5D_Co_minimalnie_potrzebne_zeby_mie=E 6_klienta_My?==?iso-8859-2?Q?SQL_na_Linuxie=3F?=
[newbie] MS SQL - praca =?ISO-8859-2?Q?jednocze=B6nie_na_2_?==?ISO-8859-2?Q?bazach_=28linkowanie_=3F=29?=
zanotowane.pldoc.pisz.plpdf.pisz.pllatwa-kasiora.pev.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 |
|