sql - 计算包括 0 连接两个具有不同行 postgres 的表

标签 sql postgresql postgresql-9.6

我有两个表,users 表包含我系统中的所有用户,另一个名为 action 的表包含用户在我系统中完成的所有操作,我想要得到的是一个查询,我可以在其中计算操作用户,如果我对一个用户没有任何操作,则为 0。

我的两个表:

Users Table:

Name       Place
----------------------
James      Supermarket
Alex       Bank 
Ignatius   BookShop

Action table:

Name   Action
--------------------
James  Buy
James  Buy
Alex   Complaint
Alex   Buy
Alex   Buy

我想要这样的东西:

Name       Transactions   Place
-------------------------------
James      2              Supermarket
Alex       3              Bank
Ignatius   0              BookShop

我尝试过:

SELECT users.name, 
   (SELECT Count(action.name) 
    FROM   action, 
           users 
    WHERE  action.name = users.name 
    GROUP  BY action.name) 
    users.place
FROM 
action, 
users 
WHERE  action.name = users.name 

但总是给我这个错误:

ERROR: more than one row returned by a subquery used as an expression SQL state: 21000

知道怎么做吗?

最佳答案

永远不要FROM 子句中使用逗号。始终使用正确、明确的 JOIN 语法。也就是说,如果您想使用相关子查询,则此查询根本不需要任何连接:

SELECT u.name, 
       (SELECT Count(*) 
        FROM action a 
        WHERE a.name = u.name 
       ) as cnt,
       u.place
FROM users u;

为了提高性能,您需要在 action(name) 上建立索引。使用这样的索引,这可能比使用 left joingroup by 的替代版本更快。

注意事项:

  • 所有的表都有表别名,是表名的缩写。
  • 此版本的查询不需要连接。
  • 子查询中没有group by
  • 外部查询中不需要where子句。

关于sql - 计算包括 0 连接两个具有不同行 postgres 的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47752745/

相关文章:

arrays - Terraform 嵌套循环对象数组,对象中有一个数组

python - Django+Postgres FATAL : sorry, 客户端已经太多了

postgresql - 在更新时锁定一个表,在子查询中锁定另一个表,哪个会先被锁定?

sql - 在 PostgreSQL 中以两种方式对数据集进行分组

MySQL IF 语句、IF SET、ELSE 什么都不做?

MySQL移动平均线计算使用CASE

mysql - SQL SELECT WHERE NOT IN 来自同一表查询

java - AS400 Java运行时文件设置库

c++ - 使用准备好的语句批量插入到Postgresql

mysql - 多个外来的 SQL 问题