>>select Members.*, CurrentStatus.CurrentDate from Members ; >>inner join (select Id, Max(ChangeDate) as CurrentDate from StatusHistory group by ID) as CurrentStatus ; >>on Members.ID = CurrentStatus.ID>>
>SELECT Mb.*, Sh.* ; > FROM Members mb ; > LEFT JOIN StatusHistory sh ON Mb.ID=sh.ID ; > WHERE Sh.ID IS NULL ; > OR sh.ID IN ; > (SELECT CTOBIN(RIGHT(MAX(DTOS(ChangeDate)+BINTOC(ID)),4)) ; > FROM StatusHistory GROUP BY ID) >>Idea by Igor Korolev from http://forum.foxclub.ru/read.php?32,177183,177232#msg-177232
CREATE CURSOR Members (MemberId int) CREATE CURSOR StatusHistory (MemberId int, ChangeDate D) FOR asd = 1 TO 20 INSERT INTO Members VALUES (asd) FOR lll = 1 TO 5 INSERT INTO StatusHistory VALUES (asd, DATE()+lll) NEXT NEXT **** Yours SELECT Mb.*, Sh.* ; FROM Members mb ; LEFT JOIN StatusHistory sh ON Mb.MemberId =sh.MemberId ; WHERE Sh.MemberId IS NULL ; OR sh.MemberId IN ; (SELECT CTOBIN(RIGHT(MAX(DTOS(ChangeDate)+BINTOC(MemberId )),4)) ; FROM StatusHistory GROUP BY MemberId ) *** Sergey's SELECT * FROM Members mb JOIN StatusHistory sh ON sh.MemberId = mb.MemberId WHERE sh.ChangeDate = (SELECT MAX(ChangeDate) FROM StatusHistory WHERE MemberId = sh.MemberId)I prefer:
CREATE CURSOR Members (MemberId int) CREATE CURSOR StatusHistory (MemberId int, ChangeDate D) FOR asd = 1 TO 20 INSERT INTO Members VALUES (asd) FOR lll = 1 TO 5 INSERT INTO StatusHistory VALUES (asd, DATE()+lll) NEXT NEXT SELECT * ; FROM Members mb ; INNER JOIN; (SELECT ff.* FROM StatusHistory ff; INNER JOIN (SELECT MemberId, MAX(ChangeDate) AS ChangeDate; FROM StatusHistory ttt; GROUP BY MemberId) ss; ON ff.MemberId = ss.MemberId AND; ff.ChangeDate = ss.ChangeDate) sh; ON Mb.MemberId =sh.MemberId