2009-05-19 11 views
0

Dies wurde behoben. Die Anweisung befand sich in einem anderen Teil der gespeicherten Prozedur.SQL - Top 1 mit der Reihenfolge auswählen?

Die gespeicherte Prozedur Ich schreibe mir nicht erlauben, dies zu tun:

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 

gibt mir diese Fehlermeldung:

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.

Was mache ich falsch?

[Bearbeiten] Es gibt keine Gruppe von Anweisung hier. SQL2005.

hier etwas mehr Kontext:

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

Könnten Sie die Tabellendefinitionen, die Inhalte von @Parent und @Child veröffentlichen, und die Datenbanksoftware Sie – Andomar

+0

So mit sind es keine GROUP BY-Klausel ist in dein st Atmung? Bist du dir da sicher? – spender

+0

Ich stelle fest, dass Sie sowohl @dtTopDate als auch @dtLatestDate haben. Ist das beabsichtigt? –

Antwort

1

Das Problem war in einem anderen Teil der gespeicherten Prozedur. Ich benutzte eine Zählung (*) woanders und es erforderte eine Gruppe von. Danke für die Hilfe.

1

Welche Version von SQL verwenden Sie? Es funktioniert gut für mich auf MS SQL Server 2005 (ionce Ich repariere die Deklaration).

0

SELECT @dtLatestDate = TOP 1 date_build Versuchen ...

+0

-1 Syntaxfehler – Andomar

+0

Ja.Sollte vor dem Vorschlagen überprüft haben. ;) –

1

Ehrlich gesagt das einzige, was ich falsch sehen kann, ist, dass @dtTopDate =/= @dtLatestDate Abgesehen davon gibt es keine GROUP BY-Klausel in Ihre SQL-Anweisung.

Ich lief nur das und es hat gut funktioniert.

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

Versuchen Sie, die Spalten korrekt alle Unklarheiten oder x-Datenbank-Schema Problem zu vermeiden Qualifying

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 

Oder alias es

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

Dies funktioniert für mich, aber ich bin nicht sicher, Wenn dies das ist, was Sie versuchen, b/c Ihr Beispiel hat einige Fehler.

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

Statt SELECT TOP 1 ... ORDER BY ...

Warum nicht versuchen, SELECT MAX (..

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

wenn Sie wirklich schwierig zu bekommen, in T-SQL können Sie versuchen, die row_number() Methode verwendet und eine innere wählen:

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;