Tsql 如果指定了select DISTINCT,则ORDER BY项目必须出现在选择列表中

Tsql 如果指定了select DISTINCT,则ORDER BY项目必须出现在选择列表中,tsql,Tsql,如果指定了select DISTINCT,则上述查询是错误的,ORDER BY项目必须出现在选择列表中 .但如果我删除DISTINCT,则会运行此查询 我希望确保清晰性,并且我还希望通过createddate DESC保持排序顺序 我的一个相关职位是 基本上是告诉查询按不存在的字段对输出进行排序 必须将createddate放入select语句中,或者可以按tagid、[Description]和createddate分组,并按createddate排序 现在,如果您觉得在包含distinct

如果指定了select DISTINCT,则上述查询是错误的,ORDER BY项目必须出现在选择列表中

.但如果我删除DISTINCT,则会运行此查询

我希望确保清晰性,并且我还希望通过createddate DESC保持排序顺序

我的一个相关职位是


基本上是告诉查询按不存在的字段对输出进行排序

必须将createddate放入select语句中,或者可以按tagid、[Description]和createddate分组,并按createddate排序


现在,如果您觉得在包含distinct createddate时可能会得到重复的标记ID和描述,请围绕该标记ID和描述包装另一个查询,并仅对这两个字段执行前10个distinct操作。

您基本上是告诉查询按不存在的字段对输出进行排序

必须将createddate放入select语句中,或者可以按tagid、[Description]和createddate分组,并按createddate排序


现在,如果您觉得在包含distinct createddate时可能会得到重复的标记ID和描述,那么请围绕它包装另一个查询,并仅在这两个字段上执行前10个distinct操作。

好的,因此我们只关心基于最近创建日期的每个标记,因此我们可以将内部查询构造为:

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 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

我们不再需要区分(因为
GROUP BY
MAX
已经确保每个标记只出现一次)

好的,因此我们只关心每个标记的最新创建日期,因此我们可以将内部查询构造为:

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 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

而且我们不再需要distinct(因为
GROUP BY
MAX
已经确保每个标记只出现一次)

“如果指定select distinct,则ORDER BY items必须出现在选择列表中”-您确实意识到,如果如您所说,删除distinct,则此短语不再适用。。。(如果指定了Y,则需要X-并且您已删除了Y)另外,SQL Server的版本是什么?因此您的第一个问题对您的实际问题具有误导性?@Damien_The_unsiver:SQL Server 2005“如果指定了select DISTINCT,则ORDER BY items必须出现在选择列表中”-您确实意识到,如果,如您所说,您删除了DISTINCT,这句话不再适用。。。(如果指定了Y,则需要X-并且您已经删除了Y)另外,SQL Server的版本是什么?那么您的第一个问题对您的实际问题具有误导性?@Damien_The_unsiever:SQL Server 2005