由于逻辑执行序列的原因,我认为在WHERE子句和JOIN ON子句中使用别名是非法的。这两个子句位于SELECT之前,因此没有定义别名。
然而,我最近读了两个代码,它们在这两个子句中有一个别名,运行起来没有问题。
SELECT w1.id
FROM weather AS w1
JOIN weather AS w2 ON DATEDIFF(w1.recordDate, w2.recordDate) = 1
AND w1.Temperature > w2.Temperature;
这是在leetcode上,在JOIN子句中使用别名。
SELECT o.OrderID, o.OrderDate, c.CustomerName
FROM Customers AS c, Orders AS o
WHERE c.CustomerName = 'Around the Horn'
AND c.CustomerID = o.CustomerID;
这是在W3school上,在Where子句中使用别名。
现在,我对使用别名的限制感到困惑。有什么想法吗?
我认为您混淆了列别名和表的别名。
表别名在FROM
子句中定义。作为最佳实践,它们应该始终用于引用列名。在第一个示例中,w1
和w2
是表的别名,w1.temperature
和w2.temperature
是<em]限定的列引用>。
列别名在SELECT
子句中定义:
select 'this is a ' as column_alias
column_alias
不能用于与SELECT
关联的ON
或WHERE
子句。