sql >> Databáze >  >> RDS >> Sqlserver

Název aliasu nelze použít v klauzuli WHERE, ale v ORDER BY ano

K tomu dochází z důvodu přirozeného pořadí zpracování dotazů, které je následující:

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

Svůj alias přiřazujete v SELECT tvrzení. Jak můžete vidět WHERE je zpracován před SELECT a ORDER BY přijde po něm. To je ten důvod. Jaká jsou nyní řešení:

  • Poddotazy. Ale mohou být těžko čitelné.
  • CROSS APPLY . To by mělo zkrášlit váš kód trochu a je doporučená metoda.

CROSS APPLY přiřadí alias před WHERE prohlášení, takže je v něm použitelný.

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;

Pokud chcete zjistit více. Přečtěte si prosím tuto otázku: Jaké je pořadí provádění tohoto příkazu SQL



  1. Formátovací standardy SQL

  2. Jak ignorovat duplicitní řádky při vkládání

  3. Jak extrahovat číslo týdne z data v PostgreSQL

  4. Jak mám předat název tabulky do uloženého procesu?