PostgreSQL - jak sformułować zapytanie
Marek - 12-11-2006 01:33
PostgreSQL - jak sformułować zapytanie
Witam,
Poniżej przedstawiam fragment zapytania SQL wyrażającego moje intencje:
SELECT p.document_id, dp.* ... FROM page p, symbols s LEFT OUTER JOIN document_property dp ON (s.group_details_id=dp.group_details_id AND dp.document_id=p.document_id) WHERE p.page_id=123
fraza "AND dp.document_id=p.document_id" oczywiście jest nielegalna w Postgresie. Jak w związku z tym obejść ten problem redagując pytanie inaczej ?
-- Pozdrawiam, Marek
hubert depesz lubaczewski - 12-11-2006 01:33
On 2006-10-01, Marek <marek1967@spam.interia.pl> wrote: > Poniżej przedstawiam fragment zapytania SQL wyrażającego moje intencje: > SELECT p.document_id, dp.* ... > FROM page p, symbols s > LEFT OUTER JOIN document_property dp ON > (s.group_details_id=dp.group_details_id AND dp.document_id=p.document_id) > WHERE p.page_id=123 > fraza "AND dp.document_id=p.document_id" oczywiście jest nielegalna w > Postgresie. Jak w związku z tym obejść ten problem redagując pytanie inaczej > ?
intencje są niejasne. po co w ogóle tam symbols? nie widzę byś coś z nimi robił.
depesz
-- mój boże, spraw abym milczał, dopóki się nie upewnię, że naprawdę mam coś do powiedzenia. (c) 1998 depesz
Marek - 12-11-2006 01:33
> intencje są niejasne. po co w ogóle tam symbols? nie widzę byś coś z > nimi robił.
Hejka !
Teraz zacytuję siebie samego "przedstawiam fragment zapytania SQL" :-)))
Zapewniam, że tabela "symbols" jest tu najważniejsza. A co do intencji moich już tłumaczę w czym rzecz. Pełne zapytanie SQL ma postać, a raczej chciałbym aby miało podobną postać:
SELECT s.html, s.inactive_html, s.description, s.group_details_id, dp.content, gd.property_type_id , gd.display_name, pg.show_www, gd.property_name, gd.help_text, dp.document_id, p.document_id AS document2_id FROM page p, symbols s LEFT OUTER JOIN document_property dp ON (s.group_details_id=dp.group_details_id AND dp.document_id=p.document_id) LEFT OUTER JOIN group_details gd ON (s.group_details_id=gd.group_details_id) LEFT OUTER JOIN property_group pg ON (pg.property_group_id=gd.property_group_id) WHERE s.nick='abc' AND p.page_id=123456";
Jest to tak naprawdę zbitka paru niezależnych pytań zwracających niezależnie po zero lub jednym rekordzie. Tak więc pomyślałem sobie, że zaoszczędzę trochę na czasie realizacji zapytań zbijając wszystko w jedno zapytanie kierowane do czasem niepowiązanych ze sobą tabel. Otóż zależy mi na:
1. wydobyciu z bazy danych symbolu o określonum nicku (zawsze 1 rekord) 2. wydobyciu z tabeli page ID dokumentu do, którego przynależy (zawsze 1 rekord) 3. wykorzystaniu w/w ID dokumentu do wyłonienia z tabeli document_property rekordu związanego z symbolem polem group_details_id oraz z konkretnym dokumentem polem document_id (zero lub 1 rekord) 4. otrzymaniu dodatkowych informacji z tabel group_details i property_group ściśle powiązanych ze sobą wzajemnie oraz z document_property.
Jeśli punkt 3 nie zwróci żadnego rekordu, w konsekwencji punkt 4ty też niczego nie zwróci) to dwa wcześniejsze punkty powinny być zrealizowane - dlatego stosuję LEFT OUTER JOINy.
Tak jak napisałem, fragment "dp.document_id=p.document_id" jest nielegalny w Postgresie. Mogę to obejść rozbijając pytanie na 2. W pierwszym z nich wydobyłbym ID dokumentu: SELECT document_id FROM page WHERE page_id=123456. Potem programowo mógłbym wstawić document_id do kolejnego pytania SQL już jako liczbę. Wolałbym to jednak zrobić w 1 zapytaniu SQL. Czy to wykonalne w Postgresie? WIem, że w MySQLu da się to wykonać gdyż JOINować można więcej niż 1 tabelę.
hubert depesz lubaczewski - 12-11-2006 01:33
On 2006-10-01, Marek <marek1967@spam.interia.pl> wrote: > Zapewniam, że tabela "symbols" jest tu najważniejsza. A co do intencji moich > już tłumaczę w czym rzecz. Pełne zapytanie SQL ma postać, a raczej chciałbym > aby miało podobną postać: > SELECT s.html, s.inactive_html, s.description, s.group_details_id, > dp.content, gd.property_type_id > , gd.display_name, pg.show_www, gd.property_name, gd.help_text, > dp.document_id, p.document_id AS document2_id > FROM page p, symbols s > LEFT OUTER JOIN document_property dp ON > (s.group_details_id=dp.group_details_id AND dp.document_id=p.document_id) > LEFT OUTER JOIN group_details gd ON > (s.group_details_id=gd.group_details_id) > LEFT OUTER JOIN property_group pg ON > (pg.property_group_id=gd.property_group_id) > WHERE s.nick='abc' > AND p.page_id=123456";
no to czemu nie zrobisz po prostu: from page p left outer join document_property dp ON dp.document_id = p.document_id left outer join symbols s on dp.group_details_id = s.group_details_id ... ?
> Tak jak napisałem, fragment "dp.document_id=p.document_id" jest nielegalny w > Postgresie. Mogę to obejść rozbijając pytanie na 2. W pierwszym z nich > wydobyłbym ID dokumentu:
nie pisz tak. "dp.document_id = p.document_id" to całkowicie legalny zapis. użyłeś go tylko w sposób sugerujący iż nie do końca rozumiesz jak działają joiny.
depesz
-- mój boże, spraw abym milczał, dopóki się nie upewnię, że naprawdę mam coś do powiedzenia. (c) 1998 depesz
Marek - 12-11-2006 01:33
> no to czemu nie zrobisz po prostu: > from > page p > left outer join document_property dp ON dp.document_id = p.document_id > left outer join symbols s on dp.group_details_id = s.group_details_id > ... > ?
Bo mnie przyćmiło :-))))
> nie pisz tak. > "dp.document_id = p.document_id" to całkowicie legalny zapis. użyłeś go > tylko w sposób sugerujący iż nie do końca rozumiesz jak działają joiny.
To zależy od dialektu SQL danej bazy. W MySQLu taki zapis funkcjonuje choć w nieco innej składni. Otóż tam joiny można robić na wielu tablelacj
LEFT OUTER JOIN tabela1, tabela2, ... tabelaN ...
....czy jakoś tak. Można na poziomie joina definiować relacje między każdą tabelą wzajemnie a nie tylko 2ma. Nie mówmy tu o standardach SQLa bo okaże się, że jest to utopijne pojęcie :-))) Podsumowując: to nie ja rozumiem czy nie rozumiem joinów, to bazy danych różnie je interpretują.
Rafal M - 12-11-2006 01:33
Marek wrote: >> no to czemu nie zrobisz po prostu: >> from >> page p >> left outer join document_property dp ON dp.document_id = p.document_id >> left outer join symbols s on dp.group_details_id = s.group_details_id >> ... >> ? > > Bo mnie przyćmiło :-)))) > >> nie pisz tak. >> "dp.document_id = p.document_id" to całkowicie legalny zapis. użyłeś go >> tylko w sposób sugerujący iż nie do końca rozumiesz jak działają joiny. > > To zależy od dialektu SQL danej bazy. W MySQLu taki zapis funkcjonuje > choć w nieco innej składni. Otóż tam joiny można robić na wielu tablelacj > > LEFT OUTER JOIN tabela1, tabela2, ... tabelaN ... > > ...czy jakoś tak. Można na poziomie joina definiować relacje między > każdą tabelą wzajemnie a nie tylko 2ma. Nie mówmy tu o standardach SQLa > bo okaże się, że jest to utopijne pojęcie :-))) Podsumowując: to nie ja > rozumiem czy nie rozumiem joinów, to bazy danych różnie je interpretują. > >
dlaczego uzywacie LEFT OUTER JOIN ? nie lepiej po prostu LEFT JOIN ?
Marek - 12-11-2006 01:33
> dlaczego uzywacie LEFT OUTER JOIN ? > nie lepiej po prostu LEFT JOIN ?
Wszystko jedno. Jednakże ze względu na precyzyjność kwerendy w sensie odbioru jej przez programistę lepiej jest napisać o jakiego join'a chodzi. W ten sposób unikam ewentualnych nieporozumień w dyskusji.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
=?ISO-8859-2?Q?Narz=EAdzie_do_budowania_zapyta=F1_SQL=2C?==?I SO-8859-2?Q?_PL/PgSQL=2C_PL/SQL=2C_T-SQL?=
[ms sql] =?ISO-8859-2?Q?wy=B6wietlenie_pierwszych_5_rekord?==?ISO-8859-2?Q?=F3w_z_zapytania_=3F_odpowiednik_ROWNUM_w_o?== ?ISO-8859-2?Q?raclu_dla_MS_SQL=27a?=
phpMyAdmin zadaje =?ISO-8859-2?Q?z=B3e_zapytania=2E=2E=2E_Dl?==?ISO-8859-2?Q?aczego=3F?=
[MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?=
[PostgreSQL] - jak =?ISO-8859-2?Q?zabezpieczy=E6_interesy_tw?==?ISO-8859-2?Q?=F3rcy_systemu_=3F=3F=3F?=
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
postgresql - int/int
[mysql/php] jak =?ISO-8859-2?Q?zliczy=E6_ilo=B6=E6_unikalnyc?==?ISO-8859-2?Q?h_rekord=F3w_w_jednym_zapytaniu=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.pllunadance.htw.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 |
|