为什么这个sql代码段总是返回8或1?
结果是什么:为什么这个sql代码段总是返回8或1?,sql,count,common-table-expression,cross-join,Sql,Count,Common Table Expression,Cross Join,结果是什么: 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子句中的子查询)生成由两
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子句中的子查询)生成由两行组成的派生表
- 然后,在外部查询中,
子句两次生成该结果集的笛卡尔乘积:总共8行(from
)2*2*2
子句统计行数,即select
8
with
子句中的行内容无关紧要:这5
和6
很可能是foo
和bar
,或者null
和null
,结果是相同的
区别在于
with
子句生成的行数。如果它只生成一行,结果将是1
(1*1*1
)。如果它生成了3行,您将得到27
-依此类推。查询的作用如下:
- 公共表表达式(with子句中的子查询)生成由两行组成的派生表
- 然后,在外部查询中,
子句两次生成该结果集的笛卡尔乘积:总共8行(from
)2*2*2
子句统计行数,即select
8
with
子句中的行内容无关紧要:这5
和6
很可能是foo
和bar
,或者null
和null
,结果是相同的
区别在于with
子句生成的行数。如果它只生成一行,结果将是1
(1*1*1
)。如果它生成3行,您将得到27
-依此类推。此表达式:
WITH Tbl AS (SELECT 5 AS A UNION SELECT 6 AS A)
WITH Tbl AS (SELECT 5 AS A UNION SELECT 5 AS A)
创建包含两行的(派生)表
这句话:
WITH Tbl AS (SELECT 5 AS A UNION SELECT 6 AS A)
WITH Tbl AS (SELECT 5 AS A UNION SELECT 5 AS A)
创建一个包含一行的(派生)表,因为UNION
删除重复项
查询的其余部分只计算三向笛卡尔乘积中的行数,即111或222。此表达式:
WITH Tbl AS (SELECT 5 AS A UNION SELECT 6 AS A)
WITH Tbl AS (SELECT 5 AS A UNION SELECT 5 AS A)
创建包含两行的(派生)表
这句话:
WITH Tbl AS (SELECT 5 AS A UNION SELECT 6 AS A)
WITH Tbl AS (SELECT 5 AS A UNION SELECT 5 AS A)
创建一个包含一行的(派生)表,因为UNION
删除重复项
查询的其余部分只计算三向笛卡尔乘积中的行数,即111或222。请注意,如果使用
UNION ALL
而不是UNION
,它将始终回答8。联合会删除重复项。请注意,如果使用的是UNION ALL
而不是UNION
,它将始终回答8。工会删除了副本。谢谢你的回答,这非常有帮助。如果你不介意的话,我有一个后续问题。。。这可能与笛卡尔乘积的工作方式有关。它两次生成这个结果集的笛卡尔积是什么意思?在我看来,FROM后面的表达式只是将A、B和C设置为Tbl,Tbl是2,我猜Count(*)只是指定将它们相乘。我不知道这两个数字是从哪里来的,因为我只看到三个数字相乘。谢谢你的回答,这非常有帮助。如果你不介意的话,我有一个后续问题。。。这可能与笛卡尔乘积的工作方式有关。它两次生成这个结果集的笛卡尔积是什么意思?在我看来,FROM后面的表达式只是将A、B和C设置为Tbl,Tbl是2,我猜Count(*)只是指定将它们相乘。我不知道这两个数字是从哪里来的,因为我只看到三个数字相乘。谢谢你,我不知道Union删除了那样的重复项。谢谢你,我不知道Union删除了那样的重复项。