如何改善联合迭代

问题描述

| 我试图在数据库上进行有效的查找,但是很费劲。以下代码段是从存储过程生成的,该存储过程遍历所有类别和字段名。问题是我需要基于优先级的前1个查询。另一个问题是,我现在需要将此扩展到多个位置,而不仅仅是现在从我的.net代码所做的一个位置,以使其效率更高。 任何建议都会有所帮助,谢谢
DECLARE @ApplicationProviderId INT
SET @ApplicationProviderId = 3
DECLARE @LocationId BIGINT
SET @LocationId = 928502
DECLARE @CategoryId INT
SET @CategoryId = 502
SELECT  sub.VolatileLocationContentId,sub.ContentProviderId,sub.CategoryId,sub.FieldName,sub.Value  --,sub.*
    FROM
        (SELECT     TOP 1 vlc.VolatileLocationContentId,vlc.ContentProviderId,vlc.CategoryId,vlc.FieldName,vlc.Value

        FROM            [VolatileLocationContent] vlc

        INNER JOIN  [ApplicationProviderContentProviderVolatileLocationContentField] apcpvlc
        ON          vlc.ContentProviderId = apcpvlc.ContentProviderId
        AND         vlc.FieldName = apcpvlc.FieldName

        WHERE           apcpvlc.ApplicationProviderId = @ApplicationProviderId
        AND         LocationId = @LocationId
        AND         vlc.FieldName = \'DescriptionStandard\'
        AND         NOT vlc.Value IS null AND           vlc.CategoryId = @CategoryId                AND         vlc.DeactivatedOn IS NULL
        ORDER BY    apcpvlc.Priority
        ) sub
UNION
            SELECT  sub.VolatileLocationContentId,vlc.Value

        FROM            [VolatileLocationContent] vlc

        INNER JOIN  [ApplicationProviderContentProviderVolatileLocationContentField] apcpvlc
        ON          vlc.ContentProviderId = apcpvlc.ContentProviderId
        AND         vlc.FieldName = apcpvlc.FieldName

        WHERE           apcpvlc.ApplicationProviderId = @ApplicationProviderId
        AND         LocationId = @LocationId
        AND         vlc.FieldName = \'Image1\'
        AND         NOT vlc.Value IS null AND           vlc.CategoryId = @CategoryId                AND         vlc.DeactivatedOn IS NULL
        ORDER BY    apcpvlc.Priority
        ) sub
    

解决方法

        也许是这样的:
DECLARE @ApplicationProviderId INT;
SET @ApplicationProviderId = 3;
DECLARE @LocationId BIGINT;
SET @LocationId = 928502;
DECLARE @CategoryId INT;
SET @CategoryId = 502;
WITH sub AS (
    SELECT     vlc.VolatileLocationContentId,vlc.ContentProviderId,vlc.CategoryId,vlc.FieldName,vlc.Value,ROW_NUMBER() OVER (PARTITION BY vlc.FieldName
                                      ORDER BY apcpvlc.Priority) AS rownum
    FROM       [VolatileLocationContent] vlc
    INNER JOIN [ApplicationProviderContentProviderVolatileLocationContentField] apcpvlc
    ON         vlc.ContentProviderId = apcpvlc.ContentProviderId
    AND        vlc.FieldName = apcpvlc.FieldName

    WHERE      apcpvlc.ApplicationProviderId = @ApplicationProviderId
    AND        LocationId = @LocationId
    AND        vlc.FieldName IN (\'DescriptionStandard\',\'Image1\')
    AND        NOT vlc.Value IS null
    AND        vlc.CategoryId = @CategoryId
    AND        vlc.DeactivatedOn IS NULL
)
SELECT
  sub.VolatileLocationContentId,sub.ContentProviderId,sub.CategoryId,sub.FieldName,sub.Value
FROM sub
WHERE sub.rownum = 1