sql >> データベース >  >> RDS >> Sqlserver

SQL Server 2005 - Row_Number()

    ORDER BY ROW_NUMBER 内 句は、結果セットの順序を保証しません。

    ROW_NUMBER 通常、クエリ プランで並べ替えを使用すると、値が事前に並べ替えられます。

    これは副作用であり、信頼すべきではありません。

    DISTINCT Hash Match (Aggregate) を使用

    ORDER BY を追加 句をクエリの最後に:

    SELECT  DISTINCT (ID), State_Id, Name_Of_Trip, Date_Of_Travel, Creation_Date, Locking_Id, Applicant_Name, Reference_Number, State_Name
    FROM    (
            SELECT  app.ID, app.State_Id, app.Name_Of_Trip, app.Date_Of_Travel,
                    app.Creation_Date, app.Locking_Id, app.Applicant_Name, app.Reference_Number, 
                    State.Name AS State_Name, ROW_NUMBER() OVER(ORDER BY Reference_Number DESC) as rowNum  
            FROM    Application_Leg AS app 
            INNER JOIN
                    State AS state 
            ON      app.State_Id = state.ID
            WHERE   app.State_Id IN (5, 6, 8)
                    AND app.Organisation_Id = 12 
                    AND Leg_Number IN
                    (
                    SELECT  Leg_Number 
                    FROM    Application_Leg as al
                    INNER JOIN
                            Organisation as org
                    ON      al.Organisation_Id = org.ID
                    WHERE   al.ID = app.ID
                            AND org.Approval_Required = 1
                            AND Mode_Of_Transport = 1
                    )
            ) AS pagedApplications
    WHERE   rowNum BETWEEN 0 AND (0 + 10)
    ORDER BY
            ReferenceNumber DESC
    

    また、10 を返さないことに注意してください。 明確な結果、DISTINCT を返します 最初の 10 の 結果。

    前者が必要な場合は、これを使用してください:

    SELECT  DISTINCT TOP 10 ID, State_Id, Name_Of_Trip, Date_Of_Travel, Creation_Date, Locking_Id, Applicant_Name, Reference_Number, State_Name
    FROM    (
            SELECT  app.ID, app.State_Id, app.Name_Of_Trip, app.Date_Of_Travel,
                    app.Creation_Date, app.Locking_Id, app.Applicant_Name, app.Reference_Number, 
                    State.Name AS State_Name
            FROM    Application_Leg AS app 
            INNER JOIN
                    State AS state 
            ON      app.State_Id = state.ID
            WHERE   app.State_Id IN (5, 6, 8)
                    AND app.Organisation_Id = 12 
                    AND EXISTS
                    (
                    SELECT  Leg_Number 
                    FROM    Application_Leg AS al
                    INNER JOIN
                            Organisation as org
                    ON      al.Organisation_Id = org.ID
                    WHERE   al.ID = app.ID
                            AND al.LegNumber = app.LegNumber
                            AND org.Approval_Required = 1
                            AND Mode_Of_Transport = 1
                    )
            ) AS pagedApplications
    ORDER BY
            ReferenceNumber DESC
    


    1. SQLステートメントでグループ化されていない列を取得する方法(MySQLと同様)

    2. プライバシーを維持しながら、Google Maps APIでFusionTablesを使用する方法は?

    3. 大文字と小文字を区別する SQL Server 2008 の一意の列

    4. Doctrine_Expression(doctrine 1.2)が最後の7日間を取得しようとする方法