Как использовать TOP 1 в JOIN, так как он возвращает несколько записей / строк - PullRequest
0 голосов
/ 31 октября 2018

у меня ниже query --->

    Select * into #MostPopular from                                                                 
 (Select top 10                                                               
 T.RowID as RowID,                                                                 
 CP.PostID,ISNULL(MS.Tagname,'Salud') as TagName                                                         
 from CS_Posts as CP with (nolock)
 INNER JOIN @TempPostIds AS T ON T.PostID = CP.PostID  ----this is temp table which has RowId and PostID                                      
Inner JOIN cs_Posts_InCategories CPC (NOLOCK) ON CPC.PostID=CP.PostID   ---returns multiple categoryIDs as it has multiple entries for single unique PostID
 INNER JOIN SpecialTagContent MS (NOLOCK) ON CPC.CategoryId=MS.CategoryId      -- returns tagname for each unique category ID
 where                                                                
 T.RowID >= @RowID AND T.RowID <= @RowID + @PageSize                                                              
 Order By                                                                
 T.RowID )AS MostPopular                                

select * from #MostPopular

Фактический результат как указано ниже ->

enter image description here

Если вы видите фактический результат, то ROWID,PostID равны multiple, потому что таблица cs_Posts_InCategories имеет multiple entries для 906477 and so on...

Ожидаемый результат как указано ниже ->

enter image description here

Для каждого PostID должно быть возвращено Top 1 tagName, как показано выше. Не могли бы вы помочь мне с запросом, чтобы он мог вернуть только TOP 1 Tagname/CategoryID

Угадайте проблему с приведенным ниже запросом ->

Inner JOIN cs_Posts_InCategories CPC (NOLOCK) ON CPC.PostID=CP.PostID   ---returns multiple categoryIDs as it has multiple entries for single unique PostID

Я также проверил, используя запрос TOP 1 ->

 ISNULL( TOP 1 MS.Tagname,'Salud') as TagName   ---didnt work for me..

Заранее спасибо !!

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Применить row_mumber до объединения:

with CPC as
 ( 
   select *,
      row_number()
      over(partition by RowID, PostID
           order by whatever_determines_your_expected_result) as rn
   from cs_Posts_InCategories   --- returns multiple categoryIDs as it has multiple entries for single unique PostID
 )
Select top 10                                                               
   T.RowID as RowID,                                                                 
   CP.PostID,ISNULL(MS.Tagname,'Salud') as TagName                                                         
from CS_Posts as CP with (nolock)
INNER JOIN @TempPostIds AS T ON T.PostID = CP.PostID  ----this is temp table which has RowId and PostID                                      
Inner JOIN CPC ON CPC.PostID=CP.PostID 
INNER JOIN SpecialTagContent MS (NOLOCK) ON CPC.CategoryId=MS.CategoryId  -- returns tagname for each unique category ID
where CPC.rn = 1  -- 
  and T.RowID >= @RowID
  AND T.RowID <= @RowID + @PageSize                                                              
Order By T.RowID
0 голосов
/ 31 октября 2018

Простой метод использует apply:

select top 10 T.RowID as RowID,                                                                 
       CP.PostID, coalesce(MS.Tagname, 'Salud') as TagName
into #MostPopular                                                        
from CS_Posts CP join
     @TempPostIds T 
     on T.PostID = CP.PostID outer apply
     (select top (1) ms.*                          
      from cs_Posts_InCategories CPC join
           SpecialTagContent MS 
           on CPC.CategoryId = MS.CategoryId
      where CPC.PostID = CP.PostID 
     ) ms
where T.RowID >= @RowID and T.RowID <= @RowID + @PageSize                                                              
order By T.RowID;

Возвращает один произвольный тег. Если есть порядок, добавьте order by . . . в подзапрос apply.

0 голосов
/ 31 октября 2018

вы можете попробовать с помощью оконной функции row_ число ()

    with cte as        
    (
      Select                                                               
     T.RowID as RowID,                                                                 
     CP.PostID,ISNULL(MS.Tagname,'Salud') as TagName                                                         
     from CS_Posts as CP with (nolock)
     INNER JOIN @TempPostIds AS T ON T.PostID = CP.PostID  ----this is temp table which has RowId and PostID                                      
    Inner JOIN cs_Posts_InCategories CPC (NOLOCK) ON CPC.PostID=CP.PostID   ---returns multiple categoryIDs as it has multiple entries for single unique PostID
     INNER JOIN SpecialTagContent MS (NOLOCK) ON CPC.CategoryId=MS.CategoryId      -- returns tagname for each unique category ID
     where                                                                
     T.RowID >= @RowID AND T.RowID <= @RowID + @PageSize                                                              
     Order By                                                                
     T.RowID 
    ) , cte2 as
    (
     select *,
     row_number() over(partition by ROWID,POSTID order by TagName) rn
     from cte  
    ) select top 10 * from cte2 where rn=1
...