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.

Comments


Comments powered by Disqus