My comments imbedded.... Scott Hamm <[EMAIL PROTECTED]> wrote on 05/03/2005 03:16:31 PM:
> Since I'm learning about Left joins and am trying to figure out a way > to quickly gather info from Database all at once, here is the SQL > statement. Please give me feedback how I should improve it for better > performance. There are around 10 users that will hit database like > this along with other left joins ever minute. Thanks in advance: > First, THANK YOU for formatting your query. > SELECT > QA.ID, > Brands.Brand, > QA.KeyDate, > A2.LastName + ', ' + A2.FirstName as Reviewer, > A1.LastName + ', ' + A1.FirstName as Operator, > Batch.[order], > Errortypes.[Description], > ErrorTypes.points, > Batch.Comments, These next two statements have the potential to be evaluated once per row. However, you are not running a subquery that uses any values from the outer query so you are in essence computing constants for these next two columns. > (SELECT > sum(Errortypes.points) > FROM > ErrorTypes,QAErrors,Batch,QA > WHERE > Errortypes.Id=QAErrors.ErrorTypeID > AND > QAErrors.ID=Batch.QEID > AND > Batch.QAID=QA.ID > AND > QA.Batch='464005807') as points, > (SELECT > count(*)*100 > FROM > Batch,QA > WHERE > Batch.QAID=QA.ID > AND > QA.Batch='464005807') as total You say you are learning about LEFT joins (which, btw, look just like INNER joins) but you aren't using INNER JOINS? You are using crappy Oracle-style comma-separated table lists (ugggh). (It's not "wrong" to do this, it's just my personal pet peeve) > FROM > Brands,Associates A1, Associates A2,QA > Left Join > Batch > ON > Batch.QAID=QA.ID > Left Join > QAErrors > ON > QAErrors.ID=Batch.QEID > Left Join > Errortypes > On > ErrorTypes.id=QAErrors.ErrorTypeID > WHERE > QA.Batch='464005807' > AND > A1.ID=QA.OperatorID > AND > A2.ID=QA.QAID > AND > Brands.ID=QA.BrandID; > > > RESULT (delimited by ,): > > 100528,Imaged G-5,2005-05-03 00:00:00,Cahall, Margaret,Custis, > Teresa,244770323,Error in Name,8.0,last name mispelled,24.0,600 > 100528,Imaged G-5,2005-05-03 00:00:00,Cahall, Margaret,Custis, > Teresa,244770323,Error in Address,8.0,blvd mispelled,24.0,600 > 100528,Imaged G-5,2005-05-03 00:00:00,Cahall, Margaret,Custis, > Teresa,244770324,Error in Address,8.0,BLVD MISSPELLED,24.0,600 > 100528,Imaged G-5,2005-05-03 00:00:00,Cahall, Margaret,Custis, > Teresa,244770325,NULL,NULL,NULL,24.0,600 > 100528,Imaged G-5,2005-05-03 00:00:00,Cahall, Margaret,Custis, > Teresa,244770322,NULL,NULL,NULL,24.0,600 > 100528,Imaged G-5,2005-05-03 00:00:00,Cahall, Margaret,Custis, > Teresa,244770321,NULL,NULL,NULL,24.0,600 <snip> See how the last two columns are always the same values. If that is really what you wanted to compute for those columns, there is an easier way to do it. Use variables to hold the results of computin those values then just add them to the SELECT clause of your final query. That way you are certain that the engine only computes them values once. I would modify your query to look like this (assuming that the Batch field on the QA table is really a numeric value and not a string): SELECT @points := sum(Errortypes.points) FROM ErrorTypes INNER JOIN QAErrors ON Errortypes.Id=QAErrors.ErrorTypeID INNER JOIN Batch ON QAErrors.ID=Batch.QEID INNER JOIN QA ON Batch.QAID=QA.ID WHERE QA.Batch=464005807; SELECT @total := count(1)*100 FROM Batch INNER JOIN QA ON Batch.QAID=QA.ID WHERE QA.Batch=464005807; SELECT QA.`ID`, Brands.`Brand`, QA.`KeyDate`, CONCAT(A2.`LastName`,', ',A2.`FirstName`) as Reviewer, CONCAT(A1.`LastName`,', ',A1.`FirstName`) as Operator, Batch.`order`, Errortypes.`Description`, ErrorTypes.`points`, Batch.`Comments`, @points as points, @total as total FROM Brands INNER JOIN QA ON Brands.ID=QA.BrandID INNER JOIN Associates A1 ON A1.ID=QA.OperatorID INNER JOIN Associates A2 ON A2.ID=QA.QAID Left Join Batch ON Batch.QAID=QA.ID Left Join QAErrors ON QAErrors.ID=Batch.QEID Left Join Errortypes ON ErrorTypes.id=QAErrors.ErrorTypeID WHERE QA.Batch=464005807; (BTW - I think the original query came from M$ SQL Server. Did it?) Without knowing more about what it is you are trying to get with this query, it's hard to make a better guess on how to make it work. The main issues I saw were: a) abusing subqueries when variables were more appropriate. b) using [] instead of `` to delimit reserved field names (not supported by MySQL). c) using + as a string concatenator (not supported by MySQL). d) using the comma-separated form of implicit inner joins and not fully declared, explicit INNER JOIN clauses. Shawn Green Database Administrator Unimin Corporation - Spruce Pine