gpt4 book ai didi

sql - 为什么计数在空表上不返回 0

转载 作者:行者123 更新时间:2023-12-05 00:10:49 24 4
gpt4 key购买 nike

我需要计算一个表的行数,但我提示 count(*) 的异常行为。

当我在空表上使用多列选择时,count(*) 不会返回结果。但是,如果我从 select 语句(单列选择)中删除其他列,则返回预期结果(0 行)。

在下面的代码中,您会发现多个测试来向您展示我在说什么。

代码结构如下:

1) 创建表

2)多列选择空表测试,返回意外结果

3) 空表测试单列选择,返回预期结果

4) 多列选择填表测试,返回预期结果

问题

鉴于这个结果,我的问题是:

为什么空表上的多列选择不返回 0,而单列选择返回它?

预期结果定义

对我来说预期的结果意味着:

如果表为空,count(*) 返回 0。

如果表不为空,count 返回行数

--创建测试表

CREATE TABLE #EMPTY_TABLE(
ID INT
)

DECLARE @ID INT
DECLARE @ROWS INT

--带空表的多列选择
--assignment attempt (Multi-column SELECT)
SELECT @ID = ID, @ROWS = COUNT(*)
FROM #EMPTY_TABLE

--return Null instead of 0
SELECT @ROWS Test_01 , ISNULL(@ROWS, 1 )'IS NULL'

--Set variable with random value, just to show that not even the assignment is happening
SET @ROWS = 29

--assignment attempt (Multi-column SELECT)
SELECT @ID = ID, @ROWS = COUNT(*)
FROM #EMPTY_TABLE

--return 29 instead of 0
SELECT @ROWS Test_02

--带空表的单列选择
--assignment attempt (Single-column SELECT)
SELECT @ROWS = COUNT(*)
FROM #EMPTY_TABLE

--returns 0 the expected result
SELECT @ROWS Test_03

--带填充表的多列选择
--insert a row
INSERT INTO #EMPTY_TABLE(ID)
SELECT 1

--assignment attempt
SELECT @ID = ID, @ROWS = COUNT(*)
FROM #EMPTY_TABLE

--Returns 1
SELECT @ROWS Test_04

最佳答案

因此,我阅读了 sybase 的分组机制,并得出结论,在您的查询中,您有一个“Transact-SQL 扩展列”(请参阅​​:docs on group by 下使用 -> Transact-SQL 扩展分组依据并具有):

A select list that includes aggregates can include extended columns that are not arguments of aggregate functions and are not included in the group by clause. An extended column affects the display of final results, since additional rows are displayed.* (emphasis mine)



(关于 *: 最后一个语句在您的特定情况下实际上是错误的,因为一行变成了零行)

也在 docs on group by在 Usage -> How group by 和使用聚合的查询下你会发现:

The group by clause collects the remaining rows into one group for each unique value in the group by expression. Omitting group by creates a single group for the whole table. (emphasis mine)



所以本质上:
  • 有一个 COUNT(*)将触发整个查询成为聚合,因为它是聚合函数(导致隐式 GROUP BY NULL )
  • SELECT 中添加 ID子句,然后将第一个组(不包含行)扩展为其包含的行(无)并将其与聚合结果列连接在一起。

  • 在您的情况下:计数为 0,因为您还查询 id,对于每个 id,都会生成一行并附加计数。但是,由于您的表没有行,因此没有任何结果行,因此没有分配。 (一些示例在链接的文档中,并且由于没有 id 并且现有的 id 必须在结果的 id 列中,...)

    要始终获得计数,您应该只需要 SELECT @ROWS = COUNT(*)并分别选择id。

    关于sql - 为什么计数在空表上不返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55159141/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com