如何改进联合迭代

时间:2011-05-31 11:09:59

标签: tsql sql-server-2008 union

我试图在数据库上进行有效的查找,但是却在苦苦挣扎。以下代码段是从存储过程生成的,该过程循环遍历所有类别和字段名。问题是我需要基于priorty的前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, 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 = 'Image1'
        AND         NOT vlc.Value IS null AND           vlc.CategoryId = @CategoryId                AND         vlc.DeactivatedOn IS NULL
        ORDER BY    apcpvlc.Priority
        ) sub

1 个答案:

答案 0 :(得分:0)

也许是这样的:

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