Price Jones
Price Jones

Reputation: 2008

use field in sql join where clause

I am trying to write a crystal report using a sql statement because it runs much much faster. But I am having trouble with some of the linkings. I need to use the result of a link for criteria in subsequent links.

Ok, here is a sample of what my statement looks like:

(The lines marked with ** are the lines in question)

SELECT
    Part.PartNum,
    Cust.CustNum,
    Cust.CustID,
    YTD.Qty
FROM
    (
    SELECT
        Pub.Part.PartNum,
        Pub.Part.UserChar1 AS CustID
    FROM
        Pub.Part
    ) AS Part
        LEFT OUTER JOIN (
            SELECT
                Pub.Customer.CustID,
                Pub.Customer.CustNum,
                Pub.Customer.Name
            FROM
                Pub.Customer
            WHERE
                Pub.Customer.CustID = '1038'
        ) AS Cust 
            ON Part.CustID = Cust.CustID
        LEFT OUTER JOIN (
            SELECT
                Pub.OrderDtl.PartNum,
                Sum(Pub.OrderDtl.OrderQty) AS Qty
            FROM
                Pub.OrderHed JOIN Pub.OrderDtl ON
                    Pub.OrderHed.OrderNum = Pub.OrderDtl.OrderNum
            WHERE
                **Pub.OrderHed.CustNum = Cust.CustNum AND**
                **Pub.OrderDtl.PartNum = Part.PartNum AND**
                YEAR(Pub.OrderHed.OrderDate)=YEAR(CURDATE())
            GROUP BY 
                Pub.OrderDtl.PartNum
        ) AS YTD ON Part.PartNum = YTD.PartNum

Now, I get an error that says:

Part.PartNum cannot be found or is not specified for the query.

I get the same error for Cust.CustNum. Will you help me figure out what I am doing wrong? Thanks!

Upvotes: 1

Views: 614

Answers (2)

Taryn
Taryn

Reputation: 247720

The problem is that you are using one of the aliases, inside of a sub-query which you cannot do. You will have to do something similar to this:

SELECT Part.PartNum,
  Cust.CustNum,
  Cust.CustID,
  YTD.Qty
FROM
(
  SELECT Pub.Part.PartNum,
    Pub.Part.UserChar1 AS CustID
  FROM Pub.Part
) AS Part
LEFT OUTER JOIN
(
  SELECT Pub.Customer.CustID,
    Pub.Customer.CustNum,
    Pub.Customer.Name
  FROM Pub.Customer
  WHERE Pub.Customer.CustID = '1038'
) AS Cust
  ON Part.CustID = Cust.CustID
LEFT OUTER JOIN
(
  SELECT Pub.OrderDtl.PartNum,
    Sum(Pub.OrderDtl.OrderQty) AS Qty,
    Pub.OrderHed.CustNum
  FROM Pub.OrderHed 
  JOIN Pub.OrderDtl 
    ON Pub.OrderHed.OrderNum = Pub.OrderDtl.OrderNum
  WHERE YEAR(Pub.OrderHed.OrderDate)=YEAR(CURDATE())
  GROUP BY Pub.OrderDtl.PartNum, Pub.OrderHed.CustNum
) AS YTD
  ON Part.PartNum = YTD.PartNum
  AND Cust.CustNum = YTD.CustNum

Looking at your query more, you can actually get rid of two of the subqueries:

SELECT Part.PartNum,
  Cust.CustNum,
  Cust.CustID,
  YTD.Qty
FROM Pub.Part Part
LEFT OUTER JOIN Pub.Customer Cust
  ON Part.CustID = Cust.CustID
  AND Cust.CustID = '1038'
LEFT OUTER JOIN
(
  SELECT d.PartNum,
    Sum(d.OrderQty) AS Qty,
    h.CustNum
  FROM Pub.OrderHed h
  JOIN Pub.OrderDtl d
    ON h.OrderNum = d.OrderNum
  WHERE YEAR(h.OrderDate)=YEAR(CURDATE())
  GROUP BY d.PartNum
) AS YTD
  ON Part.PartNum = YTD.PartNum
  AND Cust.CustNum = YTD.CustNum

Upvotes: 1

Sebas
Sebas

Reputation: 21532

This is because you can't access a parent sub-query (cust, part) within another sub-query (YTD)

However, the solution is easy in your case, filter in the ON clause instead:

SELECT
    Part.PartNum,
    Cust.CustNum,
    Cust.CustID,
    YTD.Qty
FROM
    (
    SELECT
        Pub.Part.PartNum,
        Pub.Part.UserChar1 AS CustID
    FROM
        Pub.Part
    ) AS Part
        LEFT OUTER JOIN (
            SELECT
                Pub.Customer.CustID,
                Pub.Customer.CustNum,
                Pub.Customer.Name
            FROM
                Pub.Customer
            WHERE
                Pub.Customer.CustID = '1038'
        ) AS Cust 
            ON Part.CustID = Cust.CustID
        LEFT OUTER JOIN (
            SELECT
                Pub.OrderDtl.PartNum,
                Sum(Pub.OrderDtl.OrderQty) AS Qty,
                Pub.OrderHed.CustNum
            FROM
                Pub.OrderHed JOIN Pub.OrderDtl ON
                    Pub.OrderHed.OrderNum = Pub.OrderDtl.OrderNum
            WHERE
                YEAR(Pub.OrderHed.OrderDate)=YEAR(CURDATE())
            GROUP BY 
                Pub.OrderDtl.PartNum
        ) AS YTD ON Part.PartNum = YTD.PartNum AND Cust.CustNum = YTD.CustNum

Upvotes: 1

Related Questions