Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Always trips me up!
Message
Information générale
Forum:
Visual FoxPro
Catégorie:
Base de données, Tables, Vues, Index et syntaxe SQL
Versions des environnements
Visual FoxPro:
VFP 9 SP1
OS:
Windows XP SP2
Database:
Visual FoxPro
Divers
Thread ID:
01233129
Message ID:
01233170
Vues:
18
>>
>>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
>>
>>But it would not return you the current status from the StatusHistory, so you need to modify it even further, e.g. join with itself (StatusHistory) to get status corresponding to the Current Date.
>>
>>Looks like Sergey's SQL will do the job better.
>
>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
>
>This one I like the best.

Hmmmm,
Did you tried it?
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
Against Stupidity the Gods themselves Contend in Vain - Johann Christoph Friedrich von Schiller
The only thing normal about database guys is their tables.
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform