Problem z podzapytaniem

0

Muszę połączyć dane z dwóch tabel.

Mam tabele "klienci" i "operacje". Wybieram pewną grupę z tabeli "klienci" i chcę do wyników dokleić ostatnią operację dla każdego klienta.

Jak to zrobić?

//edycja
baza - postgrers

struktura tabel w dużym skrócie

klienci

id_klienta
nazwisko
imie
itd...

operacje

id_operacji
id_klienta
rodzaj_operacji
itd...

0
select K.*, O.Id_operacji from klienci K 
inner join (select max(id_operacji), klient_id from operacje group by id_klienta) O on K.klient_id=O.klient_id
where costam=costam

edit: ewentualnie "LEFT JOIN" jeżeli nie jesteś pewien czy w tabeli operacji pojawiają się wszyscy klienci
edit: nosz prostytutka, zjadło mi "on K.klient_id=O.klient_id

0

Poprawka, przepraszam.
w tabeli operacje nie ma "id_operacji" ale jest "data_operacji".
Jak to będzie z datą wyglądało?

0

Nie mam "pod ręką" Postgresa, więc nie mogę tego sprawdzić.
Spróbuj "MAX(data_operacji)" może zrobi się konwersja nie jawna. Jeżeli nie to może: "MAX(to_number(data_operacji))"
dokumentacja: http://www.postgresql.org/docs/8.3/static/functions-formatting.html

edit: poprawka, składnia to_number: http://www.java2s.com/Code/PostgreSQL/String-Functions/to_number.htm

0

Nie działa mi to. Spróbujmy inaczej.
Zrobiłem zapytanie które robi mi listę wszystkich operacji i dopisuje do każdej dane klienta.
Jak teraz z tego wybrać z tego zestawienia po dacie tylko ostatnią operację.

0
AngelEyes napisał(a)

Nie działa mi to. Spróbujmy inaczej.
Zrobiłem zapytanie które robi mi listę wszystkich operacji i dopisuje do każdej dane klienta.
Jak teraz z tego wybrać z tego zestawienia po dacie tylko ostatnią operację.

Po pierwsze: co Ci nie działa? monitor Ci się wyłączył, prądu zabrakło, wywaliło błąd składni, zapytanie przeszło ale wyniki nie spełniają założeń?
Po drugie: "zapytanie które robi mi listę wszystkich operacji i dopisuje do każdej dane klienta" - próba wyciągania z tego tylko ostatnich operacji jest nieefektywna. Bo między innymi musiałbyś grupować po wielu polach, a i tak musisz użyć MAX po dacie. Zrób tak jak napisałem wcześniej (albo sobie dodaj do tabeli operacji id z autoinkrementacją)

2

Nadal nie ma informacji jakiej bazy dotyczy problem.
Możesz to na dwa sposoby (może i więcej) rozwiązać:

  1. użyć max na dacie operacji per klient
  2. użyć jakiejś ranking function (w wielu systemach bazodanowych takie są)

add.1.

select * from klientci K
left join
(
  select O.* from
  (select id_klienta, max(data_operacji) as MaxDT from  operacje) as MD
  inner join operacje O on MD.id_klienta = O.id_klienta and MD.MaxDT = O.data_operacji
) as O on K.id_klienta = O.id_klienta

wady: jeśli dla danego klienta są więcej niż jedna operacja o dokładnie tej samej dacie, to będzie powodowało błędy

add.2.

select * from klientci K
left join
(
  select * from (select row_number() over(partition by id_klienta order by data_operacji desc) as RN, * from operacje) as O where RN=1
) as O on K.id_klienta = O.id_klienta
1

Przekombinowałeś: ;)

massther napisał(a)

(...)
add.1.

select * from klientci K
left join
(
  select O.* from
  (select id_klienta, max(data_operacji) as MaxDT from  operacje) as MD
  inner join operacje O on MD.id_klienta = O.id_klienta and MD.MaxDT = O.data_operacji
) as O on K.id_klienta = O.id_klienta

(...)

vs:

 SELECT K.*, O.MaxData FROM klienci K 
LEFT JOIN (SELECT MAX(data_operacji) as MaxData, id_klienta FROM operacje GROUP BY id_klienta) O ON K.id_klienta=O.id_klienta
WHERE costam=costam
0

Ok, to ostatnie marcinsvr prawie mnie zadowala ale w tabeli operacje jest jeszcze kilka ciekawych kolumn które chciałbym pokazać, obecnie mam tylko MaxData.
Jak dodać inne?

0

Właśnie tak jak ja napisałem zapytanie. Bo jak zauważyłeś rozwiązanie marcinsvr z tabeli operacji daje ci tylko maksymalna datę operacji dla klienta, więc dlatego należy to ponownie połączyć z tabelą operacje, jak to zrobiłem.
@marcinsvr czy ty na prawdę nie miałeś takiej sytuacji w projekcie??? o_O

0
massther napisał(a)

@marcinsvr czy ty na prawdę nie miałeś takiej sytuacji w projekcie??? o_O

Ostrożnie z wyciąganiem pochopnych wniosków massther, możesz się kiedyś "naciąć" dużo gorzej ;).

@AngelEyes - jeżeli chcesz pobrać nie tylko datę to tak jak napisał massther.

0

Dziękuję wam obu. Udało mi się wyciągnąć takie dane jak chciałem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1