2012-10-05 4 views
1

SQL 문을 사용하여 Crystal 보고서를 작성하려고하는데 훨씬 빠르게 실행되기 때문입니다. 하지만 일부 연결 고리에 문제가 있습니다. 이후 링크에서 기준에 대한 링크 결과를 사용해야합니다. 나는 말한다 오류가 발생, 이제 (문제가되는 줄 수있는 라인 **로 표시)sql join where where 절

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 

:

좋아, 여기처럼 내 문 모습의 샘플입니다 :

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

Cust.CustNum에 대해 동일한 오류가 발생합니다. 내가 뭘 잘못하고 있는지 알아낼 수있게 도와 줄 수 있니? 감사!

답변

1

문제는 사용자가 할 수없는 하위 쿼리 내에서 별칭 중 하나를 사용하고 있다는 것입니다. 당신이 비슷한해야 할 것 :

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 
1

입니다

그러나 다른 서브 쿼리 (YTD) 내에서 부모의 서브 쿼리 (CUST, 부분) 솔루션은 귀하의 경우 쉽게, 대신 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