2009-05-19 16 views
0

これは解決されました。ステートメントはストアドプロシージャの別の部分にありました。私が書いているSQL - オーダーでトップ1を選択していますか?

ストアドプロシージャは、私がこれを実行することはできません。

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 

は私に、このエラーを与える:私が間違って

Column "database..table.date_build" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.

何をしているのですか?

[編集]ここにグループごとの文はありません。 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 
+0

あなたがテーブル定義、@Parentと@Childの内容、および使用しているデータベースソフトウェアを投稿できる – Andomar

+0

だから、何GROUPがでBY句がありません?あなたのatement?あなたはそれについて確かですか? – spender

+0

@dtTopDateと@dtLatestDateの両方があることに気づきました。これは意図的ですか? –

答えて

1

問題はストアドプロシージャの別の部分で発生していました。私は他の場所でカウント(*)を使用していましたが、それはグループを必要としました。助けてくれてありがとう。代わりにSELECT TOP 1の

1

使用しているSQLのバージョンは何:ここ

は、いくつかのより多くの文脈のですか?それはMS SQL Server 2005(私は宣言を修正するionce)で私のためにうまく動作します。

0

正直なところ、私が間違って見ることができる唯一のことは、@dtTopDate =/= @dtLatestDate は、それとは別に、何GROUPがで BY句がないことである

+0

-1構文エラー – Andomar

+0

はい。提案する前にチェックしておかなければならない。 ;) –

1

... SELECT @dtLatestDate = TOP 1 date_buildをお試しくださいあなたのSQLステートメント。

私はこれを実行して正常に動作しました。

declare @OrderDate datetime 

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

SELECT @OrderDate 
1

任意の曖昧さや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 
2

これは私のために動作しますが、私はよく分かりませんこれがあなたがしようとしているものなら、あなたの例にはいくつかの誤りがあります。

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

... ...

BY ORDERあなたが本当にトリッキー取得したい場合は、できるT-SQLで、MAX(..

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

を選択しようとしないのはなぜ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; 
関連する問題