Как использовать TOP 1 в JOIN, поскольку он возвращает несколько записей / строк

У меня ниже 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

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

Как использовать TOP 1 в JOIN, поскольку он возвращает несколько записей / строк

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

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

Как использовать TOP 1 в JOIN, поскольку он возвращает несколько записей / строк

Для каждого 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..

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

Итак, какое первое подвыражение возвращает неожиданный результат? Также действуйте по минимальный воспроизводимый пример. Пожалуйста, используйте текст, а не изображения / ссылки для текста, включая таблицы.

philipxy 31.10.2018 08:37
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
85
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

вы можете попробовать, используя оконную функцию row_number ()

    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

В этом случае он вернет только 5 rows, а я хочу выбрать 10 rows.

PPB 31.10.2018 08:47

@ PB-BitWiser вы показываете ожидаемый результат в 5 строках, кстати, просто удалите первые 10 из 1-го запроса, он будет применим для всех

Zaynul Abadin Tuhin 31.10.2018 09:25

Тем не менее, он возвращает 5 строк, поскольку основной cte возвращает несколько записей с повторяющимися ROWID.

PPB 31.10.2018 09:33

@ PB-BitWiser проверьте последнюю версию, если в вашей базе данных есть данные, отличные от дубликатов, он вернет

Zaynul Abadin Tuhin 31.10.2018 09:34

Есть ли другой способ ?

PPB 31.10.2018 09:35

Позвольте нам продолжить обсуждение в чате.

Zaynul Abadin Tuhin 31.10.2018 09:37

Примените соединение 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
Ответ принят как подходящий

Простой метод использует 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.

Прекрасно работает, когда в таблице есть данные, но не работает, когда данных нет, в этом случае он не возвращает строку ....

PPB 01.11.2018 13:29

@ PB-BitWiser. . . В запросе три таблицы, поэтому я не знаю, о чем вы говорите. В вашем вопросе все таблицы имеют данные. Но, без сомнения, left join или outer apply решают проблему.

Gordon Linoff 01.11.2018 17:25

Другие вопросы по теме