SQL-запрос, кроме как выберите ТОП 10 - PullRequest
0 голосов
/ 23 ноября 2018

У меня следующий запрос, в котором я исключаю два результата в Microsoft SQL Server

SELECT *
FROM News
INNER JOIN NewsAssignment on News.Id = NewsAssignment.NewsId
INNER JOIN NewsAudience on NewsAssignment.NewsAudienceId = NewsAudience.Id
WHERE NewsAudience.PortalId IN (1)

EXCEPT

SELECT *
FROM News
INNER JOIN NewsAssignment on News.Id = NewsAssignment.NewsId
INNER JOIN NewsAudience on NewsAssignment.NewsAudienceId = NewsAudience.Id
WHERE NewsAudience.PortalId IN (2)

ORDER BY News.PublishDate DESC

Результат содержит много записей, но мне нужны только первые 10 результатов.Как мне это сделать?

Ответы [ 5 ]

0 голосов
/ 23 ноября 2018

Ваш запрос не имеет смысла.Вы получаете все строки из первого подзапроса.Зачем?Потому что вы используете select * и NewsAudience.PortalId в списке выбора.Это значение автоматически отличается в зависимости от условий в подзапросах.

Я бы порекомендовал сформулировать ваши потребности по-другому.Например, вы можете указать:

SELECT n.*
FROM News n
WHERE EXISTS (SELECT 1
              FROM NewsAssignment na JOIN
                   NewsAudience nau
                   ON na.NewsAudienceId = nau.Id AND na.PortalId IN (1)
              WHERE n.Id = na.NewsId
             ) AND
      NOT EXISTS (SELECT 1
                  FROM NewsAssignment na JOIN
                       NewsAudience nau
                       ON na.NewsAudienceId = nau.Id AND na.PortalId IN (2)
                  WHERE n.Id = na.NewsId
                 )
ORDER BY n.PublishDate DESC;

Вы можете добавить TOP (10) к внешнему запросу, если дубликаты все еще остаются проблемой после исправления логики.

0 голосов
/ 23 ноября 2018

это будет работать:

SELECT TOP 10 * from  (SELECT *
FROM News
INNER JOIN NewsAssignment on News.Id = NewsAssignment.NewsId
INNER JOIN NewsAudience on NewsAssignment.NewsAudienceId = NewsAudience.Id
WHERE NewsAudience.PortalId IN (1)

EXCEPT

SELECT *
FROM News
INNER JOIN NewsAssignment on News.Id = NewsAssignment.NewsId
INNER JOIN NewsAudience on NewsAssignment.NewsAudienceId = NewsAudience.Id
WHERE NewsAudience.PortalId IN (2)

ORDER BY News.PublishDate DESC);
0 голосов
/ 23 ноября 2018

используйте ключевое слово top при использовании сервера sql

select top 10 t.* from 
(
SELECT *
FROM News
INNER JOIN NewsAssignment on News.Id = NewsAssignment.NewsId
INNER JOIN NewsAudience on NewsAssignment.NewsAudienceId = NewsAudience.Id
WHERE NewsAudience.PortalId IN (1)

EXCEPT

SELECT *
FROM News
INNER JOIN NewsAssignment on News.Id = NewsAssignment.NewsId
INNER JOIN NewsAudience on NewsAssignment.NewsAudienceId = NewsAudience.Id
WHERE NewsAudience.PortalId IN (2)
) t order by t.PublishDate desc
0 голосов
/ 23 ноября 2018

Это то, чем я закончил благодаря @Damien_The_Unbeliever и @Mayank Porwal

Select TOP(10) *
FROM
(
SELECT News.Author, News.CreateDate, News.CustomerId, News.EditDate, News.EndDate, News.Id, News.ImageUrl, News.PublishDate, News.Text, News.Title
FROM News
INNER JOIN NewsAssignment on News.Id = NewsAssignment.NewsId
INNER JOIN NewsAudience on NewsAssignment.NewsAudienceId = NewsAudience.Id
WHERE NewsAudience.PortalId IN (1)

EXCEPT

SELECT News.Author, News.CreateDate, News.CustomerId, News.EditDate, News.EndDate, News.Id, News.ImageUrl, News.PublishDate, News.Text, News.Title
FROM News
INNER JOIN NewsAssignment on News.Id = NewsAssignment.NewsId
INNER JOIN NewsAudience on NewsAssignment.NewsAudienceId = NewsAudience.Id
WHERE NewsAudience.PortalId IN (2)

) a

ORDER BY a.PublishDate DESC
0 голосов
/ 23 ноября 2018

Использование LIMIT:

Select *
FROM
(
SELECT *
FROM News
INNER JOIN NewsAssignment on News.Id = NewsAssignment.NewsId
INNER JOIN NewsAudience on NewsAssignment.NewsAudienceId = NewsAudience.Id
WHERE NewsAudience.PortalId IN (1)
ORDER BY News.PublishDate DESC

EXCEPT

SELECT *
FROM News
INNER JOIN NewsAssignment on News.Id = NewsAssignment.NewsId
INNER JOIN NewsAudience on NewsAssignment.NewsAudienceId = NewsAudience.Id
WHERE NewsAudience.PortalId IN (2)
ORDER BY News.PublishDate DESC
)a
LIMIT 10;
...