我有以下查询,我得到完美的结果我想要什么,但我想用在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子句,请帮助别名。谢谢。
我会做,而不是:
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%';
你需要了解执行的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;
你必须使用外部应用或交叉应用(选择。作为stManufacturerPartReference),如果你的服务器是2017年,你可以使用String_AGG函数来获取值,而不是FOR XML子句的列表。