Как использовать псевдоним в предложении где в SQL Server - PullRequest
0 голосов
/ 04 февраля 2019

У меня следующий запрос, и я получаю идеальный результат, что я хочу, но я хочу использовать псевдоним 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 в разделе, где оговорено следующее.

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 ».»Так, как я могу использовать псевдоним в предложении где, пожалуйста, помогите.Благодарю.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Вам необходимо узнать о порядке выполнения в запросе 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 голосов
/ 04 февраля 2019

Вы должны использовать внешнее или перекрестное применение (выберите .. AS stManufacturerPartReference), и если у вас сервер 2017, вы можете использовать функцию String_AGG для получения списка значений вместо предложения xml.

0 голосов
/ 04 февраля 2019

Я бы сделал вместо:

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%';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...