为什么这个 sql 片段 return 总是 8 或 1?

Why does this sql snippet return 8 or 1 always?

结果是什么:

WITH Tbl AS (SELECT 5 AS A UNION SELECT 6 AS A) 
SELECT COUNT(*) AS Tbl FROM Tbl AS A, Tbl AS B, Tbl AS C;

我知道结果应该是 8,但我不知道为什么。此外,当我将两个值(5 或 6)更改为相同的值时,它 returns a table 的值为 1 而不是 8 但所有其他实例它 returns 8 无论数字是多少如果他们不同。我用在线 sql 执行程序对其进行了测试。

查询的作用如下:

  • 公共 table 表达式(with 子句中的子查询)生成由两行组成的派生 table

  • 然后,在外部查询中,from 子句两次生成此结果集的笛卡尔积:总共 8 行 (2 * 2 * 2)

  • select 子句计算行数 - 即 8

with 子句中行的内容无关紧要:这个 56 很可能是 foobar,或者 nullnull,结果是一样的。

不同之处在于 with 子句生成的 的数量。如果它只生成一行,结果将是 1 (1 * 1 * 1)。如果它生成 3 行,您将得到 27 - 依此类推。

这个表达式:

WITH Tbl AS (SELECT 5 AS A UNION SELECT 6 AS A) 

创建一个包含两行的(派生的)table。

这个表达式:

WITH Tbl AS (SELECT 5 AS A UNION SELECT 5 AS A) 

创建一个(派生的)table 一行,因为 UNION 删除了重复项。

查询的其余部分只计算 3 向笛卡尔积中的行数,即 111 或 222.