ďťż
 
PostgreSQL - jak sformułować zapytanie ďťż
 
PostgreSQL - jak sformułować zapytanie
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • lunadance.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com