【问题标题】:SQL -- Selecting Top 1 with Order by?SQL -- 使用 Order by 选择 Top 1?
【发布时间】:2009-05-19 12:58:38
【问题描述】:

已解决。该语句位于存储过程的另一部分。

我正在编写的存储过程不允许我这样做:

 declare @dtTopDate datetime
  select top 1 @dtTopDate  = date_build
    from database..table
   where database..table.parent = @Parent
     and database..table.child = @Child
   order by date_build desc

给我这个错误:

列“database..table.date_build”是 在 ORDER BY 子句中无效,因为 它不包含在任何一个 聚合函数或 GROUP BY 子句。

我做错了什么?

[编辑] 这里没有 group by 语句。 SQL2005.

这里有更多上下文:

if @Notify = 0
begin
     declare @dtTopDate datetime
      select top 1 @dtTopDate  = date_build
        from database..table
       where database..table.parent = @Parent
         and database..table.child = @Child
       order by date_build desc

      insert 
        into database2..table
             (parent, child, notification_date, change_date)
      values (@Parent, @Child, @dtTopDate, getdate())
     return 
end

【问题讨论】:

  • 能否把表定义、@Parent 和@Child 的内容,以及您使用的数据库软件贴出来?
  • 所以你的语句中没有 GROUP BY 子句?你确定吗?
  • 我注意到您同时拥有@dtTopDate 和@dtLatestDate。这是故意的吗?
  • 那里的声明不正确。当前的编辑是正确的。
  • 能贴出整个存储过程吗?看起来在此之前或之后有一些东西会导致错误。

标签: sql


【解决方案1】:

这对我有用,但我不确定这是否是你试图做的 b/c 你的例子有一些错误。

use Test
go
CREATE TABLE [dbo].[MyTable]
(
    [MyTableId] [uniqueidentifier] NOT NULL,
    [MyDate] [datetime] NOT NULL,
    CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED([MyTableId] ASC,[MyDate] ASC)
)
GO
CREATE PROCEDURE ProcTopDate
(
    @MyDate datetime OUT
)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT TOP 1
        @MyDate = [MyDate]
    FROM [Test].[dbo].[MyTable]
    order by MyDate
END
GO

insert into MyTable(MyTableId, MyDate)
values(newid(), getdate())
go

declare @MyDate datetime
exec ProcTopDate @MyDate OUT
print @MyDate

【讨论】:

    【解决方案2】:

    而不是 SELECT TOP 1 ... ORDER BY ...

    为什么不试试 SELECT MAX( ..

    DECLARE @dtTopDate datetime
    SELECT @dtTopDate = MAX(date_build)
     from database..table 
     where database..table.parent = @Parent
     and database..table.child = @Child 
    

    【讨论】:

      【解决方案3】:

      您使用的是什么版本的 SQL?它适用于我在 MS SQL Server 2005 上(一旦我修复了声明)。

      【讨论】:

        【解决方案4】:

        老实说,我唯一能看出错误的是@dtTopDate =/= @dtLatestDate 除此之外,您的 SQL 语句中没有 GROUP BY 子句。

        我刚刚运行了它,它运行良好。

        declare @OrderDate datetime
        
        select top 1 @OrderDate = OrderDate
        from Orders
        where Orders.CustomerID = 'ALFKI'
         and Orders.EmployeeID = 4
        order by OrderDate desc
        
        SELECT @OrderDate
        

        【讨论】:

          【解决方案5】:

          尝试正确限定列以避免任何歧义或 x 数据库架构问题

          declare @dtTopDate datetime
          
          select top 1 
              @dtTopDate  = [database]..[table].date_build
          FROM
              [database]..[table]
          where
              [database]..[table].parent = @Parent
              and [database]..[table].child = @Child
          order by
              [database]..[table].date_build desc
          

          或者给它起别名

          declare @dtTopDate datetime
          
          select top 1
              @dtTopDate  = foo.date_build
          FROM
              [database]..[table] foo
          where
              foo.parent = @Parent
              and foo.child = @Child
          order by
              foo.date_build desc
          

          【讨论】:

            【解决方案6】:

            问题出在存储过程的另一部分。我在其他地方使用了 count(*),它需要 group by。感谢您的帮助。

            【讨论】:

              【解决方案7】:

              尝试 SELECT @dtLatestDate = TOP 1 date_build...

              【讨论】:

              • 是的。在建议之前应该检查一下。 ;)
              【解决方案8】:

              如果你想变得非常棘手,在 T-SQL 中你可以尝试使用 row_number() 方法和内部选择:

              select * from
              (
                  select 
                      db.groupId
                      , db.date_build
                      , date_build_rank = row_number() over ( partition by db.groupId order by db.date_build desc)
                  from
                      #date_build_tbl db
              ) as a 
              where a.date_build_rank < 2;
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-11-04
                • 1970-01-01
                相关资源
                最近更新 更多