Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个sql代码段总是返回8或1?_Sql_Count_Common Table Expression_Cross Join - Fatal编程技术网

为什么这个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子句中的子查询)生成由两行组成的派生表

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

  • select
    子句统计行数,即
    8

with
子句中的行内容无关紧要:这
5
6
很可能是
foo
bar
,或者
null
null
,结果是相同的


区别在于
with
子句生成的行数。如果它只生成一行,结果将是
1
1*1*1
)。如果它生成了3行,您将得到
27
-依此类推。

查询的作用如下:

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

  • 然后,在外部查询中,
    from
    子句两次生成该结果集的笛卡尔乘积:总共8行(
    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删除了那样的重复项。