在sql join where子句中使用字段

在sql join where子句中使用字段,sql,crystal-reports,openedge,Sql,Crystal Reports,Openedge,我正在尝试使用sql语句编写crystal报表,因为它的运行速度要快得多。但是我在一些链接上遇到了麻烦。我需要在后续链接中使用链接结果作为标准 好的,下面是我的陈述的示例: (标有**的行是有问题的行) 现在,我得到一个错误,它说: Part.PartNum cannot be found or is not specified for the query. 对于Cust.CustNum,我得到了相同的错误。你能帮我找出我做错了什么吗?谢谢 问题在于,您正在子查询中使用一个别名,而您不能这样做

我正在尝试使用sql语句编写crystal报表,因为它的运行速度要快得多。但是我在一些链接上遇到了麻烦。我需要在后续链接中使用链接结果作为标准

好的,下面是我的陈述的示例:

(标有**的行是有问题的行)

现在,我得到一个错误,它说:

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

对于Cust.CustNum,我得到了相同的错误。你能帮我找出我做错了什么吗?谢谢

问题在于,您正在子查询中使用一个别名,而您不能这样做。您必须执行类似的操作:

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
进一步查看您的查询,您实际上可以去掉两个子查询:

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

这是因为您无法在另一个子查询(YTD)中访问父子查询(cust,part)

但是,在您的情况下,解决方案很简单,请在ON子句中进行筛选:

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
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