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

WHERE句ではエイリアス名を使用できませんが、ORDERBYでは使用できます

    これは、次のような自然なクエリ処理順序が原因で発生します。

    1. FROM
    2. オン
    3. OUTER
    4. 場所
    5. GROUP BY
    6. CUBE | ROLLUP
    7. HAVING
    8. SELECT
    9. DISTINCT
    10. ORDER BY
    11. TOP

    SELECTでエイリアスを割り当てています 声明。ご覧のとおり、 WHERE SELECTの前に処理されます およびORDERBY その後に来る。それが理由です。回避策は何ですか:

    • サブクエリ。ただし、読みにくい場合があります。
    • CROSS APPLY 。これは美化する必要があります コードを少し使用することをお勧めします。

    CROSS APPLY WHEREの前にエイリアスを割り当てます ステートメント、その中で使用できるようにします。

    SELECT [Hotel Id]
        , latitude
        , longitude
        , establishmentname
        , Distance
    FROM [dbo].[RPT_hotels]
    CROSS APPLY (
        SELECT 6371 * ACos(Cos(RADIANS(Latitude)) * Cos(RADIANS('50.017466977673905')) * Cos(RADIANS('24.69924272460935') - RADIANS(Longitude)) + Sin(RADIANS(Latitude)) * Sin(RADIANS('50.017466977673905')))
        ) AS T(Distance)
    WHERE distance < 30
    ORDER BY Distance;
    

    詳細を知りたい場合。この質問を読んでください:このSQLステートメントの実行順序は何ですか



    1. Pythonサブプロセスからのmysqldump単一テーブル

    2. MySQL Group by Week numw/複数の日付列

    3. ユーザーのセッションデータを保存する方法

    4. SQLServerのCROSSAPPLYに類似したPostgres