SQL Server-无效的列名

问题描述

请帮助,我在查询 OrderNo2 时遇到问题。 以下是查询

SELECT 
    V.id,V.TypeApv,V.CreateDate,P.Requestor,VE.vendorName,V.InvoiceNo,V.Hawb,PA.PaymentFor,V.Amount,V.Curr,V.DueDate,V.Remarks,V.OrderNo,(SELECT 
         STUFF((SELECT disTINCT ',' + CASE WHEN [e-SAM Case]='Subsequent' OR [e-SAM Case]='DDT' AND [Local SAP PO] LIKE '5%' OR [e-SAM Case]='FBS 4'
        THEN PoNo ELSE [Local SAP PO] END
                FROM v_copo VC
                WHERE VC.AWB1 = V.Hawb
                FOR XML PATH('')),1,'')) AS OrderNo2,(SELECT ISNULL(OrderNo2,V.OrderNo)) AS OrderNoFinal
FROM
    APV_AF V
LEFT JOIN 
    APV_Person P ON P.id = V.Requestor
LEFT JOIN 
    APV_vendor VE ON VE.IDvendor = V.vendorName
LEFT JOIN 
    APV_Payment PA ON PA.IDPayment = V.PaymentFor
ORDER BY 
    V.CreateDate DESC

解决方法

您不能在定义别名的相同范围内引用别名(除了order by子句之外)。典型的解决方法包括子查询或CTE。

但是在SQL Server中,一个简单的选择是横向联接:

SELECT 
    V.id,V.TypeApv,V.CreateDate,P.Requestor,VE.VendorName,V.InvoiceNo,V.Hawb,PA.PaymentFor,V.Amount,V.Curr,V.DueDate,V.Remarks,V.OrderNo,X.OrderNo2,ISNULL(X.OrderNo2,V.OrderNo) AS OrderNoFinal
FROM APV_AF V
LEFT JOIN APV_Person P ON P.id = V.Requestor
LEFT JOIN APV_Vendor VE ON VE.IDVendor = V.VendorName
LEFT JOIN APV_Payment PA ON PA.IDPayment = V.PaymentFor
OUTER APPLY (
    SELECT 
        STUFF((SELECT DISTINCT ',' + CASE WHEN [e-SAM Case]='Subsequent' OR [e-SAM Case]='DDT' AND [Local SAP PO] LIKE '5%' OR [e-SAM Case]='FBS 4'
        THEN PoNo ELSE [Local SAP PO] END
                FROM v_copo VC
                WHERE VC.AWB1 = V.Hawb
        FOR XML PATH('')),1,'') AS OrderNo2
) X
ORDER BY V.CreateDate DESC