September 23, 2008 at 7:15 pm
I want to use derived tables instead of temp tables but need to check on a few things first.
Is the data in a derived table filtered by what it is linked to?
Consider the following code:
SELECT *
FROM DProduct AS p
INNER JOIN IItem AS i ON p.DProductID = i.DProduct
INNER JOIN ILabelBatch AS lb ON i.ILabelBatch = lb.ILabelBatchID
INNER JOIN IItemOperationReport AS ior ON i.SerialNumber = ior.SerialNumber
INNER JOIN (
SELECT ior2.SerialNumber
, MIN(ior2.SequenceStarted) AS 'minRunDate'
, ao2.DOperation
FROM IItemOperationReport AS ior2
INNER JOIN DProductStateAllowsOperation AS ao2 ON ior2.DOperation = ao2.DOperation
AND ior2.DProduct = ao2.DProduct
GROUP BY ior2.SerialNumber, ao2.DOperation
) AS FIRSTRUN ON ior.SerialNumber = FIRSTRUN.SerialNumber
AND ior.DOperation = FIRSTRUN.DOperation
AND ior.SequenceStarted = FIRSTRUN.minRunDate
INNER JOIN DOperation AS o ON ior.DOperation = o.DOperationID
WHERE ior.EOperationResultCode = 'PASS'
Will the data in the derived table FIRSTRUN include all serial numbers? Or will it only include those serial numbers which have a 'PASS' result (filtered by the WHERE CLAUSE)?
Sorry if i have confused you...
September 23, 2008 at 7:22 pm
just finished my testing and it appears that the derived table is not filtered by what it is linked to.
September 24, 2008 at 9:41 am
For your code
the derived table FIRSTRUN will return ALL results, since you didn't put a WHERE condition in there
easiest way: select the actual code inside the ( .... ), then hit F5 to run it
Think of DERIVED TABLE as another table, or view, with no natural sorting nor filter
September 24, 2008 at 10:10 am
Jerry Hung (9/24/2008)
For your codethe derived table FIRSTRUN will return ALL results, since you didn't put a WHERE condition in there
easiest way: select the actual code inside the ( .... ), then hit F5 to run it
Think of DERIVED TABLE as another table, or view, with no natural sorting nor filter
Not so.
The following example uses a standard tally table called Numbers. The execution plan shows that the derived table is filtered on a.number (using the index), returning 11 rows.
[font="Courier New"]SELECT *
FROM Numbers a
INNER JOIN (
SELECT number, CHAR(CAST(SQRT(SQRT(Number)) AS INT)+65) AS Choke1, NEWID() AS Choke2
FROM Numbers) b ON b.number = a.number
WHERE a.number BETWEEN 300000 AND 300010
[/font]
Cheers
ChrisM
For fast, accurate and documented assistance in answering your questions, please read this article.
Understanding and using APPLY, (I) and (II) Paul White
Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden
Viewing 4 posts - 1 through 3 (of 3 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy