Nie wiem czy wiecie, ale PostgreSQL jest bardzo ciekawym silnikiem bazy danych. Zapewne większość z was korzysta głównie z bazy MySQL lub bazy Oracle jeżeli pracujemy w dużych korporacjach. Mi udało się trafić do firmy, która pracuje na PostgreSQL i nie żałuję swojego doświadczenia zdobytego właśnie z tym silnikiem.
Poniżej prosty przykład jak można użyć polecania WITH do budowania ciekawych wyników, zwiększania optymalności zapytań.
WITH to jest w skrócie okienko, które buduje nam zestaw danych przechowywany w pamięci
I tak np. możemy zbudować zapytanie
SELECT * FROM client WHERE ....
które użyjemy później
WITH klienci as (
SELECT * FROM client WHERE ...
)
SELECT * FROM zamowienia
INNER JOIN klienci on klienci.id = zamowienia.id_client
Zastanawia się pewnie ktoś po co to komu potrzebne skoro możemy użyć tutaj zwykłego JOINa
Racja, ale jeżeli w okienku mamy wiele tabel i wiele danych, albo okienek mamy kilka i jedno okienko korzysta z innego mamy już ciekawe rozwiązanie, np.
WITH zamowienia_cte as (
SELECT * FROM zamowienia WHERE date > '2015-01-01'
),
produkty as (
SELECT * FROM produkty WHERE id IN (SELECT id_product FROM zamowienia_cte
),
...
...
...
...
Jak widzicie w okienku produkty będziemy wyświetlać tylko te produkty, które występują w zamówieniach, Dodatkowo finalnie możemy skorzystać z wszystkich okienek przy wyświetlaniu danych, możemy budować JOINy itd.
Jeżeli zaczniecie używać komendy WITH na pewno zrozumiecie dokładniej sens jej działania, bowiem czasami warto ograniczyć z góry zakres danych używając np indeksu, niż robić JOINa do tabeli, bowiem czas wykonywania się znacznie wydłuża...
przekonacie się o tym używając EXPLAINa, ale o nim napiszę innym razem.
Poniżej prosty przykład jak można użyć polecania WITH do budowania ciekawych wyników, zwiększania optymalności zapytań.
WITH to jest w skrócie okienko, które buduje nam zestaw danych przechowywany w pamięci
I tak np. możemy zbudować zapytanie
SELECT * FROM client WHERE ....
które użyjemy później
WITH klienci as (
SELECT * FROM client WHERE ...
)
SELECT * FROM zamowienia
INNER JOIN klienci on klienci.id = zamowienia.id_client
Zastanawia się pewnie ktoś po co to komu potrzebne skoro możemy użyć tutaj zwykłego JOINa
Racja, ale jeżeli w okienku mamy wiele tabel i wiele danych, albo okienek mamy kilka i jedno okienko korzysta z innego mamy już ciekawe rozwiązanie, np.
WITH zamowienia_cte as (
SELECT * FROM zamowienia WHERE date > '2015-01-01'
),
produkty as (
SELECT * FROM produkty WHERE id IN (SELECT id_product FROM zamowienia_cte
),
...
...
...
...
Jak widzicie w okienku produkty będziemy wyświetlać tylko te produkty, które występują w zamówieniach, Dodatkowo finalnie możemy skorzystać z wszystkich okienek przy wyświetlaniu danych, możemy budować JOINy itd.
Jeżeli zaczniecie używać komendy WITH na pewno zrozumiecie dokładniej sens jej działania, bowiem czasami warto ograniczyć z góry zakres danych używając np indeksu, niż robić JOINa do tabeli, bowiem czas wykonywania się znacznie wydłuża...
przekonacie się o tym używając EXPLAINa, ale o nim napiszę innym razem.