2016-06-23 36 views
5

Ben Stored Procedure altında ettik - Ben aşağıda PostID yukarıda SPexecute zaman, Şimdi[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 

-

--[Mercola_Optimized_GetArticlePostAMP] 732490 aşağıda olsun expected olan veriler. Olarak, cross apply içindeki sorgu, yukarıdaki postID için verilere sahiptir. Şimdi

enter image description here

Ama PostID aşağıda farklı ile aynı SPexecute - Ben empty data [rows] altına almak

--[Mercola_Optimized_GetArticlePostAMP] 40702. Gibi, cross apply içinde sorgu, yukarıdaki postID Infact için veri yok, diğer joins verileri var. Yukarıdaki durum için

enter image description here

Beklenen Sonuç - İade verileri ve CROSS APPLY için atama varsayılan değer. Nasıl yapabilirim?

+3

kullanın kullanmak istila etmek 'OUTER APPLY' yerine – gofr1

+2

@ gofr1 Teşekkürler, işe yaradı. Ama şimdi veri yokken varsayılan değeri atamak istiyorum .. –

+0

Tek bir cevapta hepsini resmileştiriyorum. Lütfen aşağıya bakın. – gofr1

cevap

8

Kullanım OUTER APPLY yerine CROSS APPLY

NULL ISNULL(MH.LastModifiedDate, @DefaultValue) as LastModifiedDate

2
Outer apply gibidir, Dış olarak sorgu

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

Çapraz uygulamak eşleşme Inner Join benzer orada olduğunu bile sadece eşleşen satırları alacak, böylece sol taraftan satırları koruyacak olan uygula değiştirme

isterseniz eşek: eşleşen satırları

güncelleme olsa bile sol tablo koruyacaktır Left join boş olması durumunda dış uygulamak satır için IGN varsayılan değer, sadece aşağıdaki gibi seçin

şey IsNull kullanın:

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

Teşekkürler çekicilik gibi çalıştı. Ama 'NULL' döndürürken varsayılan değeri atamak istiyorum –