问题描述
结果是什么
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)更改为相同值时,它会返回一个值为1而不是8的表,但所有其他实例都会返回8,无论它们是什么数字。我使用在线sql执行器对其进行了测试。
解决方法
这是查询的作用:
-
公用表表达式(
with
子句中的子查询)生成由两行组成的派生表 -
然后,在外部查询中,
from
子句两次生成此结果集的笛卡尔积:共8行(2 * 2 * 2
) -
select
子句计算行数-8
with
子句中行的内容无关紧要:5
和6
可以很好地为foo
和bar
或{ {1}}和null
,结果将相同。
与众不同的是null
子句生成的行的数量。如果仅生成一行,则结果为with
(1
)。如果它生成3行,您将得到1 * 1 * 1
-依此类推。
此表达式:
.popupcorner
创建一个包含两行的(派生)表。
此表达式:
.card
使用一行创建一个(派生的)表,因为WITH Tbl AS (SELECT 5 AS A UNION SELECT 6 AS A)
删除了重复项。
查询的其余部分仅计算3维笛卡尔积的行数,即1 1 1或2 2 2。