У меня ниже 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
Фактический результат, как показано ниже ->
Если бы вы могли видеть фактический результат, ROWID,PostID
- это multiple
, потому что в таблице cs_Posts_InCategories
есть multiple entries
для 906477 and so on...
.
ожидаемый результат, как показано ниже ->
Для каждого 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..
Заранее спасибо!!
вы можете попробовать, используя оконную функцию 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
.
@ PB-BitWiser вы показываете ожидаемый результат в 5 строках, кстати, просто удалите первые 10 из 1-го запроса, он будет применим для всех
Тем не менее, он возвращает 5 строк, поскольку основной cte
возвращает несколько записей с повторяющимися ROWID.
@ PB-BitWiser проверьте последнюю версию, если в вашей базе данных есть данные, отличные от дубликатов, он вернет
Есть ли другой способ ?
Позвольте нам продолжить обсуждение в чате.
Примените соединение 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
.
Прекрасно работает, когда в таблице есть данные, но не работает, когда данных нет, в этом случае он не возвращает строку ....
@ PB-BitWiser. . . В запросе три таблицы, поэтому я не знаю, о чем вы говорите. В вашем вопросе все таблицы имеют данные. Но, без сомнения, left join
или outer apply
решают проблему.
Итак, какое первое подвыражение возвращает неожиданный результат? Также действуйте по минимальный воспроизводимый пример. Пожалуйста, используйте текст, а не изображения / ссылки для текста, включая таблицы.