SQL JOINT和COUNT

时间:2015-11-29 18:46:30

标签: mysql sql sql-server sqlite

我有两张桌子:

  • r1:主键为k1;
  • r2:辅助密钥k1(来自r1表)重复授权
因此,

r2可以有几行,其中k1作为辅助键,例如可以执行SUM。

我的问题是,当我尝试

select
  r1.col_n,
  sum(r2.col_m),
  **count(*)as total**
from
  r1,r2
where
  r1.k1 = r2.k1

此处的COUNT(*)将返回出现的次数或r2.k1我明白这是它想要做的事情,这就是查询的含义。

我的问题是(并且不要问我为什么因为r1中有很多辅助键...大声笑)我希望COUNT()返回该联合查询中r1.k1的出现次数而不是r2.k1 ...我需要r1上的总和(r2.col_m)和计数()......

你能在这帮我吗?

1 个答案:

答案 0 :(得分:0)

您可以使用DISTINCT:

select
  r1.col_n,
  sum(r2.col_m),
  count(DISTINCT r1.k1) as total
from
  r1 INNER JOIN r2 ON r1.k1 = r2.k1
  • COUNT(*)将计算所有行(r1中的所有行与连接成功的r2中的所有行相乘)
  • COUNT(r1.k1)将计算r1.k1不为空的所有行,但仍然会对连接成功的r2中的所有行进行乘数
  • COUNT(DISTINCT r1.k1)将计算r1.k1
  • 的所有不同值

还有其他选择(例如,使用子查询进行计数,然后使用r2加入此子查询)但COUNT(DISTINCT r1.k1)应该足以满足您的问题。

此外,使用JOIN会更好,所以我转换了:

FROM r1, r2
WHERE r1.k1=r2.k2

使用以下语法:

FROM
  r1 INNER JOIN r2
  ON r1.k1=r2.k2