我试图在数据库上进行有效的查找,但是却在苦苦挣扎。以下代码段是从存储过程生成的,该过程循环遍历所有类别和字段名。问题是我需要基于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
答案 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