如何在SQL Server中使用别名where子句中

问题描述 投票:0回答:3

我有以下查询,我得到完美的结果我想要什么,但我想用在where子句条件stManufacturerPartReference别名像下面第二个查询,但它给我的错误。

WITH ProductsCTE (inProductId, inCategoryId, stCategory, stManufacturers, inCompanyId, stERPId,stManufacturerPartReference,
                                stProductName, stProductNumber, stModel, stFileLink, stImage, dcPrice,dcStandardPrice, dcOnHandQty,dcQtyOnPO,dtEstimatedShipDate, dcWeight, inSyncStatus, dtLastSyncDate,
                                inErrorRetry,flgIsActive, flgIsDeleted, inCreatedBy, inModifiedBy, dtModificationDate, dtCreationDate, inRecordCount)
                AS (
                    SELECT
                        product.inProductId,
                        product.inCategoryId,
                        product.stCategory,
                        product.stManufacturers,
                        product.inCompanyId,
                        product.stERPId,
                        product.stProductName,
                        STUFF((SELECT ', ' + PM.stManufacturerPartReference
                           FROM tblProductManufacturers PM
                           JOIN tblProducts Product on PM.inProductId = Product.inProductId
                           JOIN tblManufacturers M on M.inManufacturerId = PM.inManufacturerId
                           WHERE PM.inProductId=product.inProductId
                           ORDER BY M.stManufacturer
                           FOR XML PATH('')), 1, 1, '') as stManufacturerPartReference,
                        product.stProductNumber,
                        product.stModel,
                        product.stFileLink,
                        product.stImage,
                        product.dcPrice,
                        product.dcStandardPrice,
                        product.dcOnHandQty,
                        product.dcQtyOnPO,
                        product.dtEstimatedShipDate,
                        product.dcWeight,
                        product.inSyncStatus,
                        product.dtLastSyncDate,
                        product.inErrorRetry,
                        product.flgIsActive,
                        product.flgIsDeleted,
                        product.inCreatedBy,
                        product.inModifiedBy,
                        product.dtModificationDate,
                        product.dtCreationDate,
                        CAST((COUNT(product.inProductId) OVER()) AS BIGINT) AS inRecordCount
                    FROM tblProducts Product WITH (NOLOCK)
                    WHERE 1=1
                    AND product.flgIsDeleted <> 1 
                    AND flgIsHistoricItem <> 1 AND (product.inCompanyId = 1)   )

    SELECT  P.inProductId,
            P.inCategoryId,
            P.stCategory,
            P.stManufacturers,
            P.stManufacturerPartReference,
            P.inCompanyId,
            P.stERPId,
            P.stProductName,
            P.stProductNumber,
            P.stModel,
            P.stFileLink,
            P.stImage,
            P.dcPrice,
            P.dcStandardPrice,
            P.dcOnHandQty,
            P.dcQtyOnPO,
            P.dtEstimatedShipDate,
            P.dcWeight,
            P.inSyncStatus,
            P.dtLastSyncDate,
            P.inErrorRetry,
            P.flgIsActive,
            P.flgIsDeleted,
            P.inCreatedBy,
            P.inModifiedBy,
            P.dtModificationDate,
            P.dtCreationDate,
            P.inRecordCount
    FROM ProductsCTE P
    ORDER BY stCategory ASC
    OFFSET (1 - 1) * 1000 ROWS
    FETCH NEXT 1000 ROWS ONLY;

我想使用stManufacturerPartReference WHERE子句中像下面。

WITH ProductsCTE (inProductId, inCategoryId, stCategory, stManufacturers, inCompanyId, stERPId,stManufacturerPartReference,
                                stProductName, stProductNumber, stModel, stFileLink, stImage, dcPrice,dcStandardPrice, dcOnHandQty,dcQtyOnPO,dtEstimatedShipDate, dcWeight, inSyncStatus, dtLastSyncDate,
                                inErrorRetry,flgIsActive, flgIsDeleted, inCreatedBy, inModifiedBy, dtModificationDate, dtCreationDate, inRecordCount)
                AS (
                    SELECT
                        product.inProductId,
                        product.inCategoryId,
                        product.stCategory,
                        product.stManufacturers,
                        product.inCompanyId,
                        product.stERPId,
                        product.stProductName,
                        STUFF((SELECT ', ' + PM.stManufacturerPartReference
                           FROM tblProductManufacturers PM
                           JOIN tblProducts Product on PM.inProductId = Product.inProductId
                           JOIN tblManufacturers M on M.inManufacturerId = PM.inManufacturerId
                           WHERE PM.inProductId=product.inProductId
                           ORDER BY M.stManufacturer
                           FOR XML PATH('')), 1, 1, '') as stManufacturerPartReference,
                        product.stProductNumber,
                        product.stModel,
                        product.stFileLink,
                        product.stImage,
                        product.dcPrice,
                        product.dcStandardPrice,
                        product.dcOnHandQty,
                        product.dcQtyOnPO,
                        product.dtEstimatedShipDate,
                        product.dcWeight,
                        product.inSyncStatus,
                        product.dtLastSyncDate,
                        product.inErrorRetry,
                        product.flgIsActive,
                        product.flgIsDeleted,
                        product.inCreatedBy,
                        product.inModifiedBy,
                        product.dtModificationDate,
                        product.dtCreationDate,
                        CAST((COUNT(product.inProductId) OVER()) AS BIGINT) AS inRecordCount
                    FROM tblProducts Product WITH (NOLOCK)
                    WHERE 1=1
                    AND product.flgIsDeleted <> 1 
                    AND flgIsHistoricItem <> 1 AND (product.inCompanyId = 1) AND  stManufacturerPartReference LIKE '%ABC DEF%'  )

    SELECT  P.inProductId,
            P.inCategoryId,
            P.stCategory,
            P.stManufacturers,
            P.stManufacturerPartReference,
            P.inCompanyId,
            P.stERPId,
            P.stProductName,
            P.stProductNumber,
            P.stModel,
            P.stFileLink,
            P.stImage,
            P.dcPrice,
            P.dcStandardPrice,
            P.dcOnHandQty,
            P.dcQtyOnPO,
            P.dtEstimatedShipDate,
            P.dcWeight,
            P.inSyncStatus,
            P.dtLastSyncDate,
            P.inErrorRetry,
            P.flgIsActive,
            P.flgIsDeleted,
            P.inCreatedBy,
            P.inModifiedBy,
            P.dtModificationDate,
            P.dtCreationDate,
            P.inRecordCount
    FROM ProductsCTE P
    ORDER BY stCategory ASC
    OFFSET (1 - 1) * 1000 ROWS
    FETCH NEXT 1000 ROWS ONLY;

但它给我的错误“无效的列名称stManufacturerPartReference'。”那么,如何可以使用WHERE子句,请帮助别名。谢谢。

sql-server asp.net-mvc
3个回答
1
投票

我会做,而不是:

SELECT *, STUFF(stManufacturerPartReference, 1, 1, '') AS stManufacturerPartReference
FROM . . . . 
     . . . . CROSS APPLY
     ( SELECT ', ' + PM.stManufacturerPartReference
       FROM tblProductManufacturers PM JOIN 
            tblProducts Product 
            ON PM.inProductId = Product.inProductId JOIN 
            tblManufacturers M 
            ON M.inManufacturerId = PM.inManufacturerId
       WHERE PM.inProductId=product.inProductId
       FOR XML PATH('') 
     ) tt(stManufacturerPartReference)
WHERE . . . AND
     stManufacturerPartReference LIKE '%ABC DEF%';

0
投票

你需要了解执行的SQL查询的顺序:https://sqlbolt.com/lesson/select_queries_order_of_execution

其中来自后立即来了,因此任何别名不可筛选依据。

因为它是包裹在一个CTE,在之后的查询过滤器上stManufacturerPartReference。

WITH ProductsCTE (inProductId, inCategoryId, stCategory, stManufacturers, inCompanyId, stERPId,stManufacturerPartReference,
                                stProductName, stProductNumber, stModel, stFileLink, stImage, dcPrice,dcStandardPrice, dcOnHandQty,dcQtyOnPO,dtEstimatedShipDate, dcWeight, inSyncStatus, dtLastSyncDate,
                                inErrorRetry,flgIsActive, flgIsDeleted, inCreatedBy, inModifiedBy, dtModificationDate, dtCreationDate, inRecordCount)
                AS (
                    SELECT
                        product.inProductId,
                        product.inCategoryId,
                        product.stCategory,
                        product.stManufacturers,
                        product.inCompanyId,
                        product.stERPId,
                        product.stProductName,
                        STUFF((SELECT ', ' + PM.stManufacturerPartReference
                           FROM tblProductManufacturers PM
                           JOIN tblProducts Product on PM.inProductId = Product.inProductId
                           JOIN tblManufacturers M on M.inManufacturerId = PM.inManufacturerId
                           WHERE PM.inProductId=product.inProductId
                           ORDER BY M.stManufacturer
                           FOR XML PATH('')), 1, 1, '') as stManufacturerPartReference,
                        product.stProductNumber,
                        product.stModel,
                        product.stFileLink,
                        product.stImage,
                        product.dcPrice,
                        product.dcStandardPrice,
                        product.dcOnHandQty,
                        product.dcQtyOnPO,
                        product.dtEstimatedShipDate,
                        product.dcWeight,
                        product.inSyncStatus,
                        product.dtLastSyncDate,
                        product.inErrorRetry,
                        product.flgIsActive,
                        product.flgIsDeleted,
                        product.inCreatedBy,
                        product.inModifiedBy,
                        product.dtModificationDate,
                        product.dtCreationDate,
                        CAST((COUNT(product.inProductId) OVER()) AS BIGINT) AS inRecordCount
                    FROM tblProducts Product WITH (NOLOCK)
                    WHERE 1=1
                    AND product.flgIsDeleted  1 
                    AND flgIsHistoricItem  1 AND (product.inCompanyId = 1)   )

    SELECT  P.inProductId,
            P.inCategoryId,
            P.stCategory,
            P.stManufacturers,
            P.stManufacturerPartReference,
            P.inCompanyId,
            P.stERPId,
            P.stProductName,
            P.stProductNumber,
            P.stModel,
            P.stFileLink,
            P.stImage,
            P.dcPrice,
            P.dcStandardPrice,
            P.dcOnHandQty,
            P.dcQtyOnPO,
            P.dtEstimatedShipDate,
            P.dcWeight,
            P.inSyncStatus,
            P.dtLastSyncDate,
            P.inErrorRetry,
            P.flgIsActive,
            P.flgIsDeleted,
            P.inCreatedBy,
            P.inModifiedBy,
            P.dtModificationDate,
            P.dtCreationDate,
            P.inRecordCount
    FROM ProductsCTE P
    WHERE P.stManufacturerPartReference LIKE '%ABC DEF%'
    ORDER BY stCategory ASC
    OFFSET (1 - 1) * 1000 ROWS
    FETCH NEXT 1000 ROWS ONLY;

0
投票

你必须使用外部应用或交叉应用(选择。作为stManufacturerPartReference),如果你的服务器是2017年,你可以使用String_AGG函数来获取值,而不是FOR XML子句的列表。

© www.soinside.com 2019 - 2024. All rights reserved.