2016-06-23 9 views
5

Tôi đã ở dưới Stored Procedure -Làm thế nào để xử lý hàng trống trong CHÉO ÁP DỤNG [SQL Server]

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 

Bây giờ, khi tôi execute trên SP với dưới PostID -

--[Mercola_Optimized_GetArticlePostAMP] 732490 tôi nhận được dưới đây dữ liệu là expected. Vì, truy vấn bên trong cross apply có dữ liệu cho số postID ở trên.

enter image description here

Nhưng bây giờ, khi tôi execute cùng SP với bên dưới khác nhau PostID -

--[Mercola_Optimized_GetArticlePostAMP] 40702 tôi nhận được dưới đây empty data [rows]. Vì truy vấn bên trong cross apply không có dữ liệu cho số postID ở trên, khác joins có dữ liệu.

enter image description here

Dự kiến ​​kết quả đối với trường hợp nêu trên - Return dữ liệu và gán giá trị mặc định cho CROSS APPLY. Tôi làm nó như thế nào?

+3

Sử dụng 'OUTER APPLY' thay vì – gofr1

+2

@ gofr1 Cảm ơn, nó đã hoạt động. Nhưng bây giờ tôi muốn gán giá trị mặc định khi nó không có dữ liệu. –

+0

Tôi chính thức hóa tất cả trong một câu trả lời. Vui lòng xem bên dưới. – gofr1

Trả lời

8

Sử dụng OUTER APPLY thay vì CROSS APPLY

Để tràn NULLs sử dụng ISNULL(MH.LastModifiedDate, @DefaultValue) as LastModifiedDate

2

Thay đổi truy vấn của bạn để Outer Áp dụng mà sẽ duy trì các hàng từ phía bên trái thậm chí nếu không có trận đấu

outer APPLY (select top 1 LastModifiedDate 
    from ArticleModifiedHistory 
    where ArticleModifiedHistory.Postid = P.postid order by LastModifiedDate desc 

chéo áp dụng là tương tự như Inner Join, vì vậy bạn sẽ chỉ nhận được hàng phù hợp, Outer apply cũng giống như Left join mà sẽ duy trì bảng bên trái của bạn ngay cả khi không có hàng phù hợp

update:

nếu bạn muốn ass IGN giá trị mặc định cho bên ngoài áp dụng hàng trong trường hợp null, chỉ cần sử dụng IsNull trong chọn

một cái gì đó như dưới đây:

select *,isnull(b.id,'defaultvalue') from test1 t1 
outer apply(select id from test2 t2 where t1.id=t2.id) b 
+1

Cảm ơn nó đã hoạt động như sự quyến rũ. Nhưng tôi muốn gán giá trị mặc định khi nó trả về 'NULL' –

Các vấn đề liên quan