2016-06-23 6 views
5

मैं 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 

अब, जब मैं ऊपर SP नीचे PostID साथ execute -

--[Mercola_Optimized_GetArticlePostAMP] 732490 मैं नीचे मिल डेटा जो expected है। चूंकि, cross apply के अंदर की क्वेरी में postID के लिए डेटा है।

enter image description here

लेकिन अब, जब मैं नीचे विभिन्न PostID के साथ एक ही SPexecute -

--[Mercola_Optimized_GetArticlePostAMP] 40702 मैं empty data [rows] नीचे मिलता है। चूंकि, cross apply के अंदर की क्वेरी में postID के लिए डेटा नहीं है, अन्य joins डेटा है।

enter image description here

उपरोक्त मामले के लिए अपेक्षित परिणाम - वापसी डेटा और CROSS APPLY के लिए बताए डिफ़ॉल्ट मान। मैं यह कैसे कर सकता हूं?

+3

उपयोग लंघन करने के लिए 'बाहरी आवेदन' के बजाय – gofr1

+2

@ gofr1 धन्यवाद, यह काम किया। लेकिन अब जब मैं डेटा नहीं रखता हूं तो डिफ़ॉल्ट मान असाइन करना चाहता हूं .. –

+0

मैं सभी को एक जवाब में औपचारिक रूप से कार्यान्वित करता हूं। कृपया नीचे देखे। – gofr1

उत्तर

8

उपयोग OUTER APPLY बजाय CROSS APPLY

NULLs का उपयोग ISNULL(MH.LastModifiedDate, @DefaultValue) as LastModifiedDate

2
बदलें

बाहरी करने के लिए आपकी क्वेरी को लागू करें, भले ही यहां कोई मिलान

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

क्रॉस लागू है Inner Join के समान है जो बाएं हाथ की ओर से पंक्तियों को सुरक्षित करेगा, ताकि आप केवल मिलान पंक्तियाँ मिल जाएगा, Outer apply की तरह है Left join भले ही कोई मिलता-जुलता पंक्तियों

अद्यतन कर रहे हैं जो अपनी बाईं तालिका सुरक्षित करेगा:

अगर आप चाहते हैं गधा अशक्त के मामले में बाहरी लागू पंक्ति के लिए आईजीएन डिफ़ॉल्ट मान, बस नीचे की तरह का चयन

कुछ में IsNull का उपयोग करें:

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

धन्यवाद यह आकर्षण की तरह काम किया। लेकिन मैं डिफ़ॉल्ट मान असाइन करना चाहता हूं क्योंकि यह 'NULL' लौटाता है –

संबंधित मुद्दे