【问题标题】:Alias in Where clauses and Join on clausesWhere 子句和 Join on 子句中的别名
【发布时间】:2021-04-18 17:32:08
【问题描述】:

由于逻辑执行顺序,我认为在 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 子句中使用别名。

现在,我对使用别名的限制感到困惑。有什么想法吗?

【问题讨论】:

  • 这些都不使用别名。他们都在使用合格的列引用。

标签: sql join where-clause alias


【解决方案1】:

我认为您混淆了 column 别名和 table 别名。

表别名在FROM 子句中定义。作为最佳实践,它们应始终用于引用列名。在您的第一个示例中,w1w2table 别名,w1.temperaturew2.temperature限定列引用

SELECT 子句中定义了一个 别名:

select 'this is a ' as column_alias

column_alias 不能在与SELECT 关联的ONWHERE 子句中使用。

【讨论】:

  • 所以基本上如果它是 FROM 中的表别名,它与所有子句兼容,包括 (WHERE, GROUP BY, HAVING, ORDER BY, JOIN ),因为 FROM 首先在执行序列中。
  • @NomardicRoku 。 . .基本上是的。唯一的调整是FROM 首先用于解析 查询。执行的是优化的有向无环图,与原始查询几乎没有相似之处。
猜你喜欢
  • 2014-02-07
  • 2010-11-04
  • 2021-09-29
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
相关资源
最近更新 更多