我有两个表,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 join
和 group by
的替代版本更快。
注意事项:
- 所有的表都有表别名,是表名的缩写。
- 此版本的查询不需要连接。
- 子查询中没有
group by
。 - 外部查询中不需要
where
子句。
关于sql - 计算包括 0 连接两个具有不同行 postgres 的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47752745/