JOIN的ON子句不是谓词吗?

问题描述 投票:0回答:1

对于以下查询,根据产品订单查找客户同比增长。

SELECT 
    Cur.orderyear,
    Cur.numcusts AS curnumcusts, 
    Prv.numcusts AS prvnumcusts,
    Cur.numcusts - Prv.numcusts AS growth
FROM (
      SELECT 
        YEAR(orderdate) AS orderyear,
        COUNT(DISTINCT custid) AS numcusts
      FROM Sales.Orders
      GROUP BY YEAR(orderdate)) AS Cur
LEFT OUTER JOIN (
         SELECT 
            YEAR(orderdate) AS orderyear,
            COUNT(DISTINCT custid) AS numcusts
         FROM Sales.Orders
         GROUP BY YEAR(orderdate)) AS Prv
ON Cur.orderyear = Prv.orderyear + 1

产生以下输出

订单年份 curnumcusts prvnumcusts 成长
2020 67
2021 86 67 19
2022 81 86 -5

我的疑问是

ON Cur.orderyear = Prv.orderyear + 1
如何工作?

如果

Cur.orderyear
是 2021 年,那么
Prv.orderyear + 1
就是 2022 年。那么,2021 = 2022?记录如何在两个不同的表表达式之间匹配(尽管是相同/重复的表达式)。

我假设

ON
是一个谓词,用于查找两个连接表之间的数据相等性,而不是与数据匹配(不确定我刚才所说的是否有意义)。

您能帮我理解

ON
到底是做什么的吗?

sql sql-server subquery
1个回答
0
投票

Cur
Prev
都是从同一个
Sales.Orders
查询的事实是无关紧要的。

你可以这样想:

  • 执行
    Cur
    的内部查询。它查询的详细信息并不重要 - 唯一重要的是返回数据集。我们称这个数据集为
    Cur
  • 类似地,执行
    Prev
    的内部查询。在这里,唯一重要的是返回一个数据集,我们称之为
    Prev
  • 现在,有两个数据集,每个数据集都有自己独立的
    orderyear
    列,我们可以根据条件
    Cur.orderyear = Prv.orderyear + 1
    连接它们。
© www.soinside.com 2019 - 2024. All rights reserved.