Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
UPDATE SQL, How to use with correlated query.
Message
From
06/05/2005 18:07:22
 
 
General information
Forum:
Visual FoxPro
Category:
Databases,Tables, Views, Indexing and SQL syntax
Environment versions
Visual FoxPro:
VFP 9
Database:
Visual FoxPro
Miscellaneous
Thread ID:
01011797
Message ID:
01011835
Views:
15
>Thanks Fabio, how should be the cAgent cursor to use the AutoJoin procedure?
>
The big problem is the speed,
with this Update schema, VFP is not able to use the tables's indexes
CREATE CURSOR cMovs (iid int autoinc, iAgentID int, yAmount y, dDate d)

RAND(-1)
FOR lnCounter=1 TO 100
  INSERT INTO cMovs (iAgentID, yAmount, dDate) ;
     VALUES ((RAND()*10)-1, RAND()*1000000,date(2005,01,01)+ (RAND()*45))
ENDFOR
INDEX ON iAgentID TAG AGENT_RK


CREATE CURSOR cAgent (iid int autoinc, yMonth y, nMonth int,  nYear int)
FOR lnCounter=1 TO 10
  INSERT INTO cAgent (yMonth, nMonth, nYear) ;
   VALUES (0,1,2005)
ENDFOR

INDEX ON iid TAG AGENT_PK

CLEAR
SYS(3054,11)
?
* with inefficient solution
UPDATE A ;
  SET yMonth = cMovs.yAmount ;
  FROM cAgent A;
    JOIN (SELECT iAgentID , MONTH(dDate) nMonth , YEAR(dDate) nYear , SUM(yAmount) yAmount ;
                  FROM cMovs group by 1,2,3) cMovs;
         ON  cMovs.iAgentID = A.iID;
         AND cMovs.nMonth   = A.nMonth ;
         AND cMovs.nYear    = A.nYear;
  WHERE A.nMonth = 1 AND A.nYear=2005

BROWSE
?

* OR YOU OPTIMIZE IT WITH a literal correlation
UPDATE A ;
  SET yMonth = cMovs.yAmount ;
  FROM (SELECT iAgentID, SUM(yAmount) yAmount ;
                  FROM cMovs ;
                  WHERE MONTH(dDate)=1 AND YEAR(dDate)=2005;
                  group by 1) cMovs;
  		JOIN cAgent A;
        ON  cMovs.iAgentID = A.iID;
 		WHERE  A.nMonth = 1 AND A.nYear=2005
 
BROWSE 

?
* or use a subquery with a autojoin
 UPDATE A ;
  SET yMonth = cMovs.yAmount ;
  FROM (SELECT iAgentID, SUM(yAmount) yAmount ;
                  FROM cMovs JOIN cAgent ;
                  ON cMovs.iAgentID = cAgent.iID ;
                    AND MONTH(dDate)= cAgent.nMonth ;
                    AND YEAR(dDate) = cAgent.nYear;
                    WHERE cAgent.nMonth = 1 AND cAgent.nYear=2005 ;
                  group by iAgentID) cMovs;
  		JOIN cAgent A;
        ON  cMovs.iAgentID = A.iID
 BROWSE
Previous
Reply
Map
View

Click here to load this message in the networking platform