SQL dla opornych, cz. 2
Czas na drugą porcję mojego odkrywania rzeczy oczywistych nt. baz danych. Pierwsza część pojawiła się tutaj dwa lata temu.
Problem na dziś polegał na tym, że przy w słowniku zwracanym przez zapytanie brakowało nazw (bądź aliasów) tabel, z których brane były kolumny:
>>> zapytanie = "SELECT czas, no.kto, nn.kto FROM zdarzenia AS z LEFT JOIN numerki AS nn ON z.numer = nn.numer LEFT JOIN numerki AS no ON z.odbiorca = no.numer" >>> dbc.query(zapytanie).dictresult() [{'kto': 'Stefan', 'czas': '2006-04-09 21:27:33.21051'}]
W tabeli zdarzenia
znajdują się dwa pola z identyfikujące
strony połączenia (numer
i odbiorca
). Tabela
numerki
zawiera odzworowanie numer->kto
.
W zwróconym słowniku nie ma kluczy no.kto
i nn.kto
,
ponieważ aliasy tabel nie są uwzględnione. Druga wartość zastępuje pierwszą.
Rozwiązanie jest banalne: tak samo, jak aliasuje się tabele, można zaliasować
zwracane kolumny -- za pomocą AS
. Wynik:
>>> zap = "SELECT czas, no.kto AS okto, nn.kto AS nkto FROM zdarzenia AS z LEFT JOIN numerki AS nn ON z.numer = nn.numer LEFT JOIN numerki AS no ON z.odbiorca = no.numer" >>> dbc.query(query).dictresult() [{'okto': 'Stefan', 'nkto': 'Zenek', 'czas': '2006-04-09 21:27:33.21051'}]
Rozwiązanie podsunął mp.
Teraz tylko został mi do rozwiązania trudniejszy problem -- jak z dwóch zapytań
zrobić jedno. Są prawie identyczne, z pierwszego SELECT
a interesuje
mnie tylko .ntuples()
, czyli ilość zwróconych rekordów. Na podstawie
tej ilości doklejam do zapytanie odpowiednie LIMIT
i OFFSET
,
po czym wywołuje ponownie i wyświetlam wynik.
Archived comments:
smk 2006-04-19 20:24:54
Trudniejszy problem: nie da się. Zapytania agregującego i wybierajacego nie połączysz.
Comments
Comments powered by Disqus