如何处理 CROSS APPLY [SQL 服务器中的空行]
How to handle empty rows in CROSS APPLY [SQL Server]
我低于Stored Procedure
-
ALTER PROCEDURE [dbo].[Optimized_GetArticlePostAMP]
(
@PostID int
)
AS
BEGIN
SET NOCOUNT ON;
SET STATISTICS TIME ON
DECLARE @SectionId int ,@datediff int
DECLARE @postdate datetime
SELECT P.PostId, P.SectionID, P.PostName,MP.MetaTitle,P.Postdate,P.PostAuthor,P.IsApproved,
MP.Metadescription, MP.Metakeywords,ISNULL(MP.IsRobotsMetaTag,0) as IsRobotsMetaTag,p.TotalViews, P.Subject, P.FormattedBody,
MV.Isvideo,MV.VideoCode,MV.VideoCaption, A.DrComment,A.SpanishURL, PS.RedirectUrl, Isnull(PS.IsRedirect,0) as IsRedirect,
ISNULL(A.CommentedBy,38633) as CommentedBy ,MP.Canonical as Canonical,ISNULL(MP.RRpopUP ,0) as RRpopUP,ISNULL(A.PrevPost,0) as PreviousPostId,
ISNULL(A.NextPost,0) as NextPostId,PS.StatusId ,dbo.[mercola_GetCommentCountForPost](@PostId) as TotalReplies, isnull(PA.[FileName],'') as FileName,
PRD.StoryImage, PRD.StoryContent, ISNULL(NULLIF(prd.ALT, ''), P.Subject) AS ALT, ISNULL(PR.ReferenceData,'')as ReferenceData,
MH.LastModifiedDate,
CASE WHEN CHARINDEX('<p><strong>By', FormattedBody, -1)=1 THEN LTRIM(SUBSTRING(REPLACE(CAST(FormattedBody as varchar(max)),'<p><strong>By ',''),0,CHARINDEX('<',REPLACE(cast(FormattedBody as varchar(max)),'<p><strong>By ',''))))
ELSE 'Dr.Mercola' END as Name
FROM cs_posts P
LEFT JOIN Mercola_NewsletterDetails A on (P.Postid = A.postid)
LEFT JOIN Mercola_PostStatus PS on (PS.postid=p.postid)
LEFT JOIN Mercola_PostMetatags MP on(P.postid=MP.Postid)
LEFT JOIN Mercola_postVideo MV on(P.postid=MV.Postid)
LEFT JOIN CS_PostAttachments PA on P.PostId=PA.PostId AND PA.contenttype LIKE 'audio/mpeg' AND PA.FILENAME LIKE '%.mp3' AND PA.isremote = 1
LEFT JOIN Mercola_PostRelatedData PRD on P.PostId=PRD.PostId
LEFT JOIN Mercola_PostReferences PR on P.PostId=PR.PostId
CROSS APPLY (select top 1 LastModifiedDate from Mercola_ArticleModifiedHistory where Mercola_ArticleModifiedHistory.Postid = P.postid order by LastModifiedDate desc)MH
where P.Postid = @Postid
现在,当我 execute
上面 SP
和下面 PostID
-
--[Mercola_Optimized_GetArticlePostAMP] 732490
我得到以下数据 expected
。因为,cross apply
中的查询具有上述 postID
.
的数据
但是现在,当我 execute
相同 SP
与下面不同 PostID
-
--[Mercola_Optimized_GetArticlePostAMP] 40702
我低于 empty data [rows]
。因为,cross apply
里面的查询没有上面postID
的数据,其实其他joins
有数据。
上述情况的预期结果 -
Return 数据并为 CROSS APPLY
分配默认值。我该怎么做?
将您的查询更改为外部应用,这将保留左侧的行,即使没有匹配项
outer APPLY (select top 1 LastModifiedDate
from ArticleModifiedHistory
where ArticleModifiedHistory.Postid = P.postid order by LastModifiedDate desc
交叉应用类似于 Inner Join
,所以你只会得到匹配的行,Outer apply
就像 Left join
,它会保留你的左边 table 即使有没有匹配的行
更新:
如果要为空的情况下的外部应用行分配默认值,只需在 select
中使用 IsNull
如下所示:
select *,isnull(b.id,'defaultvalue') from test1 t1
outer apply(select id from test2 t2 where t1.id=t2.id) b
使用OUTER APPLY
代替CROSS APPLY
要溢出 NULL,请使用 ISNULL(MH.LastModifiedDate, @DefaultValue) as LastModifiedDate
我低于Stored Procedure
-
ALTER PROCEDURE [dbo].[Optimized_GetArticlePostAMP]
(
@PostID int
)
AS
BEGIN
SET NOCOUNT ON;
SET STATISTICS TIME ON
DECLARE @SectionId int ,@datediff int
DECLARE @postdate datetime
SELECT P.PostId, P.SectionID, P.PostName,MP.MetaTitle,P.Postdate,P.PostAuthor,P.IsApproved,
MP.Metadescription, MP.Metakeywords,ISNULL(MP.IsRobotsMetaTag,0) as IsRobotsMetaTag,p.TotalViews, P.Subject, P.FormattedBody,
MV.Isvideo,MV.VideoCode,MV.VideoCaption, A.DrComment,A.SpanishURL, PS.RedirectUrl, Isnull(PS.IsRedirect,0) as IsRedirect,
ISNULL(A.CommentedBy,38633) as CommentedBy ,MP.Canonical as Canonical,ISNULL(MP.RRpopUP ,0) as RRpopUP,ISNULL(A.PrevPost,0) as PreviousPostId,
ISNULL(A.NextPost,0) as NextPostId,PS.StatusId ,dbo.[mercola_GetCommentCountForPost](@PostId) as TotalReplies, isnull(PA.[FileName],'') as FileName,
PRD.StoryImage, PRD.StoryContent, ISNULL(NULLIF(prd.ALT, ''), P.Subject) AS ALT, ISNULL(PR.ReferenceData,'')as ReferenceData,
MH.LastModifiedDate,
CASE WHEN CHARINDEX('<p><strong>By', FormattedBody, -1)=1 THEN LTRIM(SUBSTRING(REPLACE(CAST(FormattedBody as varchar(max)),'<p><strong>By ',''),0,CHARINDEX('<',REPLACE(cast(FormattedBody as varchar(max)),'<p><strong>By ',''))))
ELSE 'Dr.Mercola' END as Name
FROM cs_posts P
LEFT JOIN Mercola_NewsletterDetails A on (P.Postid = A.postid)
LEFT JOIN Mercola_PostStatus PS on (PS.postid=p.postid)
LEFT JOIN Mercola_PostMetatags MP on(P.postid=MP.Postid)
LEFT JOIN Mercola_postVideo MV on(P.postid=MV.Postid)
LEFT JOIN CS_PostAttachments PA on P.PostId=PA.PostId AND PA.contenttype LIKE 'audio/mpeg' AND PA.FILENAME LIKE '%.mp3' AND PA.isremote = 1
LEFT JOIN Mercola_PostRelatedData PRD on P.PostId=PRD.PostId
LEFT JOIN Mercola_PostReferences PR on P.PostId=PR.PostId
CROSS APPLY (select top 1 LastModifiedDate from Mercola_ArticleModifiedHistory where Mercola_ArticleModifiedHistory.Postid = P.postid order by LastModifiedDate desc)MH
where P.Postid = @Postid
现在,当我 execute
上面 SP
和下面 PostID
-
--[Mercola_Optimized_GetArticlePostAMP] 732490
我得到以下数据 expected
。因为,cross apply
中的查询具有上述 postID
.
但是现在,当我 execute
相同 SP
与下面不同 PostID
-
--[Mercola_Optimized_GetArticlePostAMP] 40702
我低于 empty data [rows]
。因为,cross apply
里面的查询没有上面postID
的数据,其实其他joins
有数据。
上述情况的预期结果 -
Return 数据并为 CROSS APPLY
分配默认值。我该怎么做?
将您的查询更改为外部应用,这将保留左侧的行,即使没有匹配项
outer APPLY (select top 1 LastModifiedDate
from ArticleModifiedHistory
where ArticleModifiedHistory.Postid = P.postid order by LastModifiedDate desc
交叉应用类似于 Inner Join
,所以你只会得到匹配的行,Outer apply
就像 Left join
,它会保留你的左边 table 即使有没有匹配的行
更新:
如果要为空的情况下的外部应用行分配默认值,只需在 select
中使用 IsNull如下所示:
select *,isnull(b.id,'defaultvalue') from test1 t1
outer apply(select id from test2 t2 where t1.id=t2.id) b
使用OUTER APPLY
代替CROSS APPLY
要溢出 NULL,请使用 ISNULL(MH.LastModifiedDate, @DefaultValue) as LastModifiedDate