Marcin S.

Marcin S. BI Consultant, ETL
developer

Temat: zapytanie w PostgreSQL

Mam pewien problem z konkretnym zapytaniem:

SELECT DISTINCT NAZWISKO FROM AKTORZY A JOIN OBSADA O ON A.ID_AKTORA=O.ID_AKTORA JOIN KOPIE KO ON O.ID_FILMU=KO.ID_FILMU JOIN FILMY F ON KO.ID_FILMU=F.ID_FILMU WHERE F.TYTUL='Terminator' ORDER BY A.ID_AKTORA

Wynikiem mają być 3 rekordy w określonej kolejności bez ich duplikacji, np:
1) nazwisko aktora1
2) nazwisko aktora2
3) nazwisko aktora3

Problem w tym, że jednoczesne użycie DISTINCT i ORDER BY wyrzuca:
ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list

Jeśli użyję DISTINCT bez ORDER BY, wynik jest w odwrotnej kolejności. Natomiast użycie ORDER BY bez DISTINCT powoduje wyświeltenie (w tym przypadku) każdego nazwiska 3-krotnie. Łącznie 9 rekordów.

Gdzie jest knyf?
Tomasz S.

Tomasz S. Nokia Certified Qt
Specialist

Temat: zapytanie w PostgreSQL

Marcin S.:Mam pewien problem z konkretnym zapytaniem:

SELECT DISTINCT NAZWISKO FROM AKTORZY A JOIN OBSADA O ON A.ID_AKTORA=O.ID_AKTORA JOIN KOPIE KO ON O.ID_FILMU=KO.ID_FILMU JOIN FILMY F ON KO.ID_FILMU=F.ID_FILMU WHERE F.TYTUL='Terminator' ORDER BY A.ID_AKTORA


Wynikiem mają być 3 rekordy w określonej kolejności bez ich duplikacji, np:
1) nazwisko aktora1
2) nazwisko aktora2
3) nazwisko aktora3

Problem w tym, że jednoczesne użycie DISTINCT i ORDER BY wyrzuca:
ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list

Jeśli użyję DISTINCT bez ORDER BY, wynik jest w odwrotnej kolejności. Natomiast użycie ORDER BY bez DISTINCT powoduje wyświeltenie (w tym przypadku) każdego nazwiska 3-krotnie. Łącznie 9 rekordów.

Gdzie jest knyf?


ORDER BY wymaga aby to według czego jest sortowane było również wyświetlane. Czyli oprócz nazwiska musisz wyświetlać również ID i wtedy wszystko będzie w porządku.



Tomasz Piotr skrzypczyk edytował(a) ten post dnia 28.11.06 o godzinie 19:42
Marcin S.

Marcin S. BI Consultant, ETL
developer

Temat: zapytanie w PostgreSQL

ok, działa, ale w założeniu wynikiem mają być same nazwiska - 1 kolumna.
Jacek Ołowiak

Jacek Ołowiak kierownik zespołu IT

Temat: zapytanie w PostgreSQL

a nazwisko skąd wie w jakiej jest tabelce?

A.AKTORZY.. moze pomoze.

wg mnie narobiłeś bigosu z zbyt duzą ilością przyporządkowań.

napisz slownie o co chodzi to postaram sie sklecic sql'a
Marcin S.

Marcin S. BI Consultant, ETL
developer

Temat: zapytanie w PostgreSQL

Przyporządkowania wynikają z relacji między tabelami.

A.AKTORZY nie pomoże.

Możesz zaimportować to do bazy: http://www.wykladowcy.wsb.poznan.pl/~mzakrzewicz/tabel...

Relacje między tabelami.
http://drd.pl/db/db.doc
Marcin M.

Marcin M. Lider zespołu
programistów

Temat: zapytanie w PostgreSQL

1) Po pierwsze Obsada ma klucz obcy id_filmu który bardziej pasuje do filmu niż do kopii (gdyż zakładam że id_filmu będzie kluczem głównym w tabeli film).
Nawet na zdrowy rozsądek w danym filmie jest jedna konkretna obsada a nie w każdej kopii danego filmu może być inna.
Gdyby tak było z zapytania można pozbyć się tabeli kopie.
Wtedy FROM miałby postać

FROM
AKTORZY A
JOIN OBSADA O ON A.ID_AKTORA=O.ID_AKTORA
JOIN FILMY F ON O.ID_FILMU=F.ID_FILMU



2) Skoro jednak powiązania są jakie są i nie ma być wyświetlane ID_ADKTORA
a) Najprostsze wydaje się być opakowanie wyniku w jeszcze jednego selecta i dopiero sortowanie


SELECT NAZWISKO FROM
(
SELECT DISTINCT A.NAZWISKO, A.ID_AKTORA
FROM
AKTORZY A
JOIN OBSADA O ON A.ID_AKTORA=O.ID_AKTORA
JOIN KOPIE KO ON O.ID_FILMU=KO.ID_FILMU
JOIN FILMY F ON KO.ID_FILMU=F.ID_FILMU
WHERE
F.TYTUL='Terminator'
) AS T
ORDER BY ID_AKTORA



b) Wersja z GROUP BY - moim zdaniem prawie zawsze można użyć GROUP BY zamiast DISTINCT
(osobiście preferuje stosowanie GROUP BY ponieważ dla mnie kod jest bardziej przejrzysty i nie ma takich ograniczeń jak DISTINCT które sam właśnie odkryłeś)


SELECT A.NAZWISKO
FROM
AKTORZY A
JOIN OBSADA O ON A.ID_AKTORA=O.ID_AKTORA
JOIN KOPIE KO ON O.ID_FILMU=KO.ID_FILMU
JOIN FILMY F ON KO.ID_FILMU=F.ID_FILMU
WHERE
F.TYTUL='Terminator'
GROUP BY
A.NAZWISKO,A.ID_AKTORA
ORDER BY
A.ID_AKTORA




Koszt zapytania a) wynosił u mnie cost=237.55..239.42 a zapytania b) cost=192.29..194.17 a więc wersja b powinna być też lepsza czasowo.

Pozdrowienia

Następna dyskusja:

Dostęp do bazy PostgreSQL




Wyślij zaproszenie do