9

我有一些表格,基本上如下所示:

TBL_USER
user_id - number
user_name - varchar

TBL_STUFF
stuff_id - number
stuff_user_id - number

我想查询所有用户信息,包括他们拥有的“东西”数量。我正在尝试这样的事情:

select user_id, user_name, count(stuff_id) 
  from tbl_user
  left outer join tbl_stuff on stuff_user_id = user_id
 where user_id = 5;

但我收到一条错误消息,上面写着“不是单组功能”

还有其他方法我应该这样做吗?

4

3 回答 3

9

好吧,您缺少 group 功能;-)

尝试这个:

select user_id, user_name, count(stuff_id) 
from tbl_user left outer join tbl_stuff on stuff_user_id = user_id
where user_id = 5
group by user_id, user_name;

最后一行是group by告诉 Oracle 计算具有相同 user_id 和 user_name 组合的所有行的子句。

于 2012-04-18T13:25:00.047 回答
8

你也可以这样做:

select 
  user_id, 
  user_name, 
  (
    SELECT
        COUNT(*)
    FROM
        tbl_stuff
    WHERE 
        stuff_user_id = tbl_user.user_id

  ) AS StuffCount, 
from 
   tbl_user
where 
   user_id = 5;
于 2012-04-18T13:32:05.977 回答
1

您的一条评论指出您不想包含GROUP BY子句中存在的所有字段。

@Arion 发布了一个相关子查询重构,它给出了相同的值。

以下查询使用标准(不相关)子查询(内联视图)。这是因为使用这种内联视图结构通常可以执行相关子查询等价物。但是,也是因为我发现它们更容易维护。

WITH
  stuff_count
AS
(
  SELECT
    stuff_user_id  AS user_id,
    COUNT(*)       AS val
  FROM
    tbl_stuff
  GROUP BY
    stuff_user_id
)
SELECT
  tbl_user.user_id,
  tbl_user.user_name,
  stuff_count.val
FROM
  tbl_user
LEFT JOIN
  stuff_count
    ON stuff_count.user_id = tbl_user.user_id
WHERE
  tbl_user.user_id = 5;

注意:生成计划时,它只运行 user_id 必要的子查询,而不是整个表;)

于 2012-04-18T13:38:21.793 回答