1

Temat: Podzapytanie, grupowanie i case i ALIAS

Witam posiadam takie oto zapytanie:

SELECT "public"."Egzemplarze"."Id_egzemplarza","Id_ksiazki","Tytul", "Wydawnictwo", ARRAY_TO_STRING("Autorzy", ', ') as "Autorzys", "Mozna_wypozyczyc",
case when (
SELECT COUNT("Id_wypozyczenia")
FROM "public"."Egzemplarze"
LEFT JOIN "public"."Wypozyczenia"
ON "public"."Egzemplarze"."Id_egzemplarza" = "public"."Wypozyczenia"."Id_egzemplarza"
WHERE "public"."Wypozyczenia"."Id_egzemplarza" = "Red"."Id_egzemplarza"
GROUP BY "public"."Egzemplarze"."Id_egzemplarza"
) > 0 then 'Zajeta' else 'Wolna' end as "Dostepnosc" 
FROM "public"."Egzemplarze" as "Red"
INNER JOIN "public"."Ksiazki"
ON "public"."Egzemplarze"."Id_ksiazki" = "public"."Ksiazki"."Id"

Niestety wszystkie te cudzysłowy i słowa public są wymagane i w phpPgAdmin w zapytaniach i zapytaniach SQL poprzez PHP. Zapytanie jest najpewniej poprawne, lecz wyskakuje błąd przy samym aliasie - as "Red"

Błąd SQL:

ERROR:  invalid reference to FROM-clause entry for table "Egzemplarze"
HINT:  Perhaps you meant to reference the table alias "Red".

Zapytanie główne wyświetla rekordy z egzemplarzy (podstawowe) a podzapytanie ma liczyć ile wypożyczeń jest w tej chwili dla danego egzemplarza z zapytania głównego - na tej podstawie case na 0 i 1

Proszę o pomoc :\

Ostatnio edytowany przez Miszka (2010-06-14 04:17:37)

2

Odp: Podzapytanie, grupowanie i case i ALIAS

Jeśli już potrzebny ci ten alias to odwołaj się do niego zamiast do tabeli

FROM "public"."Egzemplarze" as "Red"
INNER JOIN "public"."Ksiazki"
ON "public"."Red"."Id_ksiazki" = "public"."Ksiazki"."Id"

3

Odp: Podzapytanie, grupowanie i case i ALIAS

Witam, rzeczywiście to ma sens : po zmianie:

SELECT "public"."Egzemplarze"."Id_egzemplarza","Id_ksiazki","Tytul", "Wydawnictwo", ARRAY_TO_STRING("Autorzy", ', ') as "Autorzys", "Mozna_wypozyczyc",
case when (
SELECT COUNT("Id_wypozyczenia")
FROM "public"."Egzemplarze"
LEFT JOIN "public"."Wypozyczenia"
ON "public"."Egzemplarze"."Id_egzemplarza" = "public"."Wypozyczenia"."Id_egzemplarza"
WHERE "public"."Wypozyczenia"."Id_egzemplarza" = "public"."Red"."Id_egzemplarza"
GROUP BY "public"."Egzemplarze"."Id_egzemplarza"
) > 0 then 'Zajeta' else 'Wolna' end as "Dostepnosc" 
FROM "public"."Egzemplarze" as "Red"
INNER JOIN "public"."Ksiazki"
ON "public"."Red"."Id_ksiazki" = "public"."Ksiazki"."Id"

Ale błąd:

ERROR:  invalid reference to FROM-clause entry for table "Red"
HINT:  There is an entry for table "Red", but it cannot be referenced from this part of the query.

Nie może się tam dostać..?

4

Odp: Podzapytanie, grupowanie i case i ALIAS

Witam serdecznie
w lewozlaczeniu masz warunek po klauzuli ON:

"public"."Egzemplarze"."Id_egzemplarza" = "public"."Wypozyczenia"."Id_egzemplarza"

a zaraz po ty dajesz inny warunek po klauzuli WHERE

"public"."Wypozyczenia"."Id_egzemplarza" = "public"."Red"."Id_egzemplarza"

ale tu podajesz Red i silnik nie rozumie (podaje Ci to w HINT); gdyby Red zamienic na Wypozyczenia pewnie bylo by dobrze ale jest to dokladnie powtorzenie warunku z lewozlaczenia i nie ma to sensu jak mi sie zdaje; a alias

 
...
"public"."Egzemplarze" as "Red"
...

dajesz po nawiasach spinajacych jedna czesc zapytania
tyle z mojej strony na poczatek
pozdrawiam

Ostatnio edytowany przez sulavix (2010-06-14 14:32:26)

5

Odp: Podzapytanie, grupowanie i case i ALIAS

1. To jak bez egzemplarzy i on - grupować? (czy postgre łyknie pole do grupowanie które nie jest kluczem głównym?) - po zmianie bez on błąd taki sam
2. To jak przenieść alias przed nawias żeby go łykną?

6

Odp: Podzapytanie, grupowanie i case i ALIAS

witam serdecznie;

poniewaz Twoje zapytanie sklada sie z kilku czesci trzeba je przeanalizowac po kolei;
poniewaz kazdy robi to po swojemu moge Ci zaproponowac moj sposob; zatem
masz dwa razy klauzule FROM; zacznijmy od pierwszej z nich czyli:

SELECT COUNT("Id_wypozyczenia")
FROM "public"."Egzemplarze"LEFT JOIN "public"."Wypozyczenia"
ON "public"."Egzemplarze"."Id_egzemplarza" = "public"."Wypozyczenia"."Id_egzemplarza"

otrzymujesz jakas wartosc i nie ma komunikatu o blędzie? jezeli tak to podaj ja prosze i/lub komunikat o bledzie;
na marginesie zastanawiam sie dlaczego uzyles lewozlaczenia?
pozdrawiam

Ostatnio edytowany przez sulavix (2010-06-14 16:06:07)

7

Odp: Podzapytanie, grupowanie i case i ALIAS

Pobieram egzemplarze. Nie każdy posiada wypożyczenie więc po to jest LEFT JOIN - jeśli będzie 0 wypożyczeń to chce 'Nie' jeśli więcej to 'Tak'. Potem dam tam warunek - nie chce liczyć wszystkiego - ale to nie ważne

KURDE. NAWET TO nie działa:

SELECT "public"."Red"."Id_egzemplarza",
(
SELECT COUNT("Id_wypozyczenia") 
FROM "public"."Wypozyczenia"
WHERE "public"."Wypozyczenia"."Id_egzemplarza" = "public"."Red"."Id_egzemplarza"
GROUP BY "public"."Wypozyczenia"."Id_egzemplarza"
) as "Dostepnosc" 
FROM "public"."Egzemplarze" as "Red"

Jest coś nie tak z przestrzenią nazw. A poza tym po cholere te " " i public? Nie można tego jakoś wyłączyć?

ERROR:  invalid reference to FROM-clause entry for table "Red"
HINT:  There is an entry for table "Red", but it cannot be referenced from this part of the query.

PODzapytanie działa poprawnie. Nadzayptanie działa poprawnie. COś jest nie tak z ALIASEM


BAZA TO PostgreSQL 8.1.9

Ostatnio edytowany przez Miszka (2010-06-14 16:21:13)

8

Odp: Podzapytanie, grupowanie i case i ALIAS

No ale gdzieś ty ten Red napisał miało być w zapytaniu zewnętrznym nie wewnętrznym

SELECT "public"."Egzemplarze"."Id_egzemplarza","Id_ksiazki","Tytul", "Wydawnictwo", ARRAY_TO_STRING("Autorzy", ', ') as "Autorzys", "Mozna_wypozyczyc",
case when (
SELECT COUNT("Id_wypozyczenia")
FROM "public"."Egzemplarze"
LEFT JOIN "public"."Wypozyczenia"
ON "public"."Egzemplarze"."Id_egzemplarza" = "public"."Wypozyczenia"."Id_egzemplarza"
WHERE "public"."Wypozyczenia"."Id_egzemplarza" = "Red"."Id_egzemplarza"
GROUP BY "public"."Egzemplarze"."Id_egzemplarza"
) > 0 then 'Zajeta' else 'Wolna' end as "Dostepnosc" 
FROM "public"."Egzemplarze" as "Red"
INNER JOIN "public"."Ksiazki"
ON "Red"."Id_ksiazki" = "public"."Ksiazki"."Id"

i zamiast "public"."Red"."Id_ksiazki" wpisz "Red"."Id_ksiazki" (wcześniej sie pomyliłem wpisujac zapytanie)