如何解决如何改善联合迭代
| 我试图在数据库上进行有效的查找,但是很费劲。以下代码段是从存储过程生成的,该存储过程遍历所有类别和字段名。问题是我需要基于优先级的前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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。