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 SELECTa 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.
Tomasz Torcz
Comments
Comments powered by Disqus