Элементы ORDER BY должны отображаться в списке выбора, если указан параметр SELECT DISTINCT - PullRequest
0 голосов
/ 22 июня 2011
declare  @userid int
set @userid=9846
SELECT TOP 10 
          tagid, 
          [Description]
FROM   tagsuggestion 
WHERE  tagid IN (SELECT **DISTINCT** TOP 10  tagid
             FROM  (SELECT ulpt.tagid, 
                           createddate 
                    FROM   userlocationposttag ulpt 
                            WHERE  ulpt.UserID=@userid                                

                    UNION ALL 
                    SELECT ult.tagid, 
                           createddate 
                    FROM   userlocationtag ult 
                             WHERE  ult.UserID=@userid
                    UNION ALL 
                    SELECT upt.tagid, 
                           createddate 
                    FROM   userprofiletag upt 
                             WHERE  upt.UserID=@userid
) T

             ORDER  BY createddate DESC)  

Вышеприведенный запрос является ошибкой. Если задано значение SELECT DISTINCT, в списке выбора должны отображаться элементы ORDER BY.

.но если я удаляю DISTINCT , этот запрос выполняется

Я хочу убедиться в четкости, а также хочу сохранить порядок сортировки с помощью createdate. DESC

Один из моих связанных постов:

Последние созданные 10 записей из всех3 стола

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

Вы в основном указываете запросу отсортировать вывод по полю, которого там нет.

Вы должны либо поместить createdate в оператор выбора, либо вы можете сгруппировать по tagid, [Описание] ИДата создания и порядок по дате создания.

Теперь, если вам кажется, что вы можете получить дубликаты тэгов и описаний, когда включите отдельную дату создания, затем обведите еще один запрос и выделите свои топ-10 только по этим двум полям.

1 голос
/ 22 июня 2011

Хорошо, поэтому мы заботимся только о каждом теге, основываясь на его последней дате создания, поэтому мы можем структурировать внутренний запрос следующим образом:

SELECT tagid,MAX(createddate) as createddate FROM (
SELECT ulpt.tagid, 
       createddate 
FROM   userlocationposttag ulpt 
WHERE  ulpt.UserID=@userid                                
UNION ALL 
SELECT ult.tagid, 
       createddate 
FROM   userlocationtag ult 
WHERE  ult.UserID=@userid
UNION ALL 
SELECT upt.tagid, 
       createddate 
FROM   userprofiletag upt 
WHERE  upt.UserID=@userid
) t
GROUP BY tagid

И тогда мы можем обернуть это в другой подпункт и применить десятку:

SELECT TOP 10 tagid FROM (
SELECT tagid,MAX(createddate) as createddate FROM (
SELECT ulpt.tagid, 
       createddate 
FROM   userlocationposttag ulpt 
WHERE  ulpt.UserID=@userid                                
UNION ALL 
SELECT ult.tagid, 
       createddate 
FROM   userlocationtag ult 
WHERE  ult.UserID=@userid
UNION ALL 
SELECT upt.tagid, 
       createddate 
FROM   userprofiletag upt 
WHERE  upt.UserID=@userid
) t
GROUP BY tagid
) t ORDER BY createddate desc

И нам больше не нужны отличные (потому что GROUP BY и MAX уже гарантировали, что каждый тег появляется только один раз)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...