代码之家  ›  专栏  ›  技术社区  ›  contactmatt

SQL查询语法:在计数中使用表别名无效?为什么?

  •  2
  • contactmatt  · 技术社区  · 16 年前

    有人能解释一下为什么下面的查询无效吗?我正在对Oracle10g数据库运行此查询。

    select count(test.*) from my_table test;
    

    我得到以下错误:ora-01747:无效的user.table.column、table.column或column规范

    然而 ,以下两个查询有效。

    select count(test.column) from my_table test;
    
    select test.* from my_table test;
    
    4 回复  |  直到 15 年前
        1
  •  4
  •   Vincent Malgrat    16 年前

    COUNT(expression) 将计算所有行的位置 expression 不是空的。 COUNT(*) 是一个异常,它返回行数: * 不是的别名 my_table.* .

        2
  •  3
  •   Thomas    16 年前

    据我所知, Count(Table.*) SQL规范中未正式支持。只有 Count(*) (对返回的所有行进行计数)和 Count(Table.ColumnName) (对给定列中的所有非空值进行计数)。所以,即使DBMS支持它,我还是建议不要使用它。`

        3
  •  1
  •   Quassnoi    16 年前

    此语法仅适用于 PostgreSQL 因为它有一个记录数据类型 test.* 是一个有意义的表达)。

    只使用 COUNT(*) .

    此查询:

    select count(test.column) from my_table test;
    

    将为您返回 test.column 不是 NULL .

    此查询:

    select test.* from my_table test;
    

    只会把你所有的记录从 my_table .

    COUNT 因此,可能是唯一一个在没有参数的情况下有意义的聚合,并且使用类似的表达式 伯爵(*) 只是一种调用函数而不提供任何实际参数的方法。

        4
  •  1
  •   Michael Streeter    15 年前

    如果正在进行外部联接,您可能合理地希望找到test.column不为空的记录数。因为每个表都应该有一个pk(它不是空的),所以如果需要的话,您应该能够对这样的行进行计数:

    select count(y.pk)
    from x
    left outer join y on y.pk = x.ck
    

    这里的count(*)不好,因为外部联接正在为信息不足的表创建一个空行。

    推荐文章