内部连接返回冗余数据而不是预期数据

时间:2016-06-08 13:29:32

标签: sql sql-server sql-server-2008 join distinct

我有以下查询 -

 SELECT CP.PostID,CP.SectionID                              
     FROM NewsLetter NW  
     inner Join MapNewsletterPosts as MM on NW.ID = MM.ID        
     inner join CSPosts as CP with (nolock) on MM.PostID = CP.PostID       
     inner join PostStatus PS on PS.Postid=CP.PostId      
     WHERE  
     NW.NewsletterDate = '2015-07-06' 
     and CP.IsApproved =1                                           
     ANd PS.StatusId =7      
     AND CP.SectionID NOT IN (92,227)        
     AND NW.SectionID = 95
     ORDER BY MM.Newslettersortorder 

以上查询返回正确的结果,如下所示 -

here

现在,当我再添加一个连接到上面的查询 -

SELECT CP.PostID,CP.SectionID                                
     FROM NewsLetter NW    
     inner Join MapNewsletterPosts as MM on NW.ID = MM.ID          
     inner join CSPosts as CP with (nolock) on MM.PostID = CP.PostID         
     inner join PostStatus PS on PS.Postid=CP.PostId      
     INNER JOIN NewsletterDetails ND ON ND.NewsletterDate = NW.NewsletterDate AND ND.IncludeInArticles=1 <<--added extra JOIN   
     WHERE    
     NW.NewsletterDate = '2015-07-06'   
     and CP.IsApproved =1                                             
     ANd PS.StatusId =7        
     AND CP.SectionID NOT IN (92,227)          
     AND NW.SectionID = 95  
     ORDER BY MM.Newslettersortorder 

导致冗余数据如下所示 -

enter image description here     我需要在查询中做出哪些更改才能返回正确的结果[distinct]。 在此先感谢... !!

4 个答案:

答案 0 :(得分:4)

您可以将额外加入替换为EXISTS()

 SELECT CP.PostID,CP.SectionID                              
 FROM NewsLetter NW  
 inner Join MapNewsletterPosts as MM on NW.ID = MM.ID        
 inner join CSPosts as CP with (nolock) on MM.PostID = CP.PostID       
 inner join PostStatus PS on PS.Postid=CP.PostId      
 WHERE EXISTS(SELECT 1 FROM NewsletterDetails nd
              WHERE ND.NewsletterDate = NW.NewsletterDate AND ND.IncludeInArticles=1)
      AND NW.NewsletterDate = '2015-07-06' 
      and CP.IsApproved =1                                           
      ANd PS.StatusId =7      
      AND CP.SectionID NOT IN (92,227)        
      AND NW.SectionID = 95
 ORDER BY MM.Newslettersortorder 

这种情况发生的原因是,在额外的表格中有超过1行且NewsletterDate相同,存在将消除此问题,您也不再需要使用DISTINCTGROUP BY。< / p>

编辑:如果您只想要那些记录IncludeInArticles=0的记录不存在的记录,请使用:

 SELECT CP.PostID,CP.SectionID                              
 FROM NewsLetter NW  
 inner Join MapNewsletterPosts as MM on NW.ID = MM.ID        
 inner join CSPosts as CP with (nolock) on MM.PostID = CP.PostID       
 inner join PostStatus PS on PS.Postid=CP.PostId      
 WHERE NOT EXISTS(SELECT 1 FROM NewsletterDetails nd
                  WHERE ND.NewsletterDate = NW.NewsletterDate AND ND.IncludeInArticles=0)
      AND NW.NewsletterDate = '2015-07-06' 
      and CP.IsApproved =1                                           
      ANd PS.StatusId =7      
      AND CP.SectionID NOT IN (92,227)        
      AND NW.SectionID = 95
 ORDER BY MM.Newslettersortorder 

编辑:很难理解你想要什么!我猜你想要IncludeInArticles = 1并且没有IncludeInArticles=0的记录?现在它是唯一剩下的选择:

 SELECT CP.PostID,CP.SectionID                              
 FROM NewsLetter NW  
 inner Join MapNewsletterPosts as MM on NW.ID = MM.ID        
 inner join CSPosts as CP with (nolock) on MM.PostID = CP.PostID       
 inner join PostStatus PS on PS.Postid=CP.PostId      
 WHERE EXISTS(SELECT 1 FROM NewsletterDetails nd
              WHERE ND.NewsletterDate = NW.NewsletterDate AND ND.IncludeInArticles=1)
   AND NOT EXISTS(SELECT 1 FROM NewsletterDetails nd
                  WHERE ND.NewsletterDate = NW.NewsletterDate AND ND.IncludeInArticles=0)
      AND NW.NewsletterDate = '2015-07-06' 
      and CP.IsApproved =1                                           
      ANd PS.StatusId =7      
      AND CP.SectionID NOT IN (92,227)        
      AND NW.SectionID = 95
 ORDER BY MM.Newslettersortorder 

答案 1 :(得分:1)

您的最终内部联接每个PostID会有多行数据。

回到第一组结果的最简单方法是将distinct修饰符添加到select:

SELECT DISTINCT CP.PostID,CP.SectionID

答案 2 :(得分:1)

您可以将ON条件替换为ND.PostId =CP.PostID

试试这个 -

SELECT CP.PostID,CP.SectionID                                
     FROM NewsLetter NW    
     inner Join MapNewsletterPosts as MM on NW.ID = MM.ID          
     inner join CSPosts as CP with (nolock) on MM.PostID = CP.PostID         
     inner join PostStatus PS on PS.Postid=CP.PostId      
     INNER JOIN NewsletterDetails ND ON ND.PostId =CP.PostID AND ND.IncludeInArticles=1    
     WHERE    
     NW.NewsletterDate = '2015-07-06'   
     and CP.IsApproved =1                                             
     ANd PS.StatusId =7        
     AND CP.SectionID NOT IN (92,227)          
     AND NW.SectionID = 95  
     ORDER BY MM.Newslettersortorder 

答案 3 :(得分:0)

发生这种情况的原因是你在NewsLetterDetails中有多行数据。尝试将此表中的一个字段拉入查询中以查看我的意思。

 SELECT 
     CP.PostID
     ,CP.SectionID 
     ,ND.*                            
 FROM NewsLetter NW    
 INNER JOIN MapNewsletterPosts as MM 
     ON NW.ID = MM.ID          
 INNER JOIN CSPosts as CP with (nolock) 
     ON MM.PostID = CP.PostID         
 INNER JOIN PostStatus PS 
     ON PS.Postid=CP.PostId      
 INNER JOIN NewsletterDetails ND 
     ON ND.NewsletterDate = NW.NewsletterDate 
     AND ND.IncludeInArticles=1    
 WHERE NW.NewsletterDate = '2015-07-06'   
     AND CP.IsApproved =1                                             
     AND PS.StatusId =7        
     AND CP.SectionID NOT IN (92,227)          
     AND NW.SectionID = 95  
 ORDER BY MM.Newslettersortorder 

如果您只是想要一个像之前一样的独特列表,那么这就是

 SELECT DISTINCT
     CP.PostID
     ,CP.SectionID 
 FROM NewsLetter NW    
 INNER JOIN MapNewsletterPosts as MM 
     ON NW.ID = MM.ID          
 INNER JOIN CSPosts as CP with (nolock) 
     ON MM.PostID = CP.PostID         
 INNER JOIN PostStatus PS 
     ON PS.Postid=CP.PostId      
 INNER JOIN NewsletterDetails ND 
     ON ND.NewsletterDate = NW.NewsletterDate 
     AND ND.IncludeInArticles=1    
 WHERE NW.NewsletterDate = '2015-07-06'   
     AND CP.IsApproved =1                                             
     AND PS.StatusId =7        
     AND CP.SectionID NOT IN (92,227)          
     AND NW.SectionID = 95  
 ORDER BY MM.Newslettersortorder