2012-04-18 37 views
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; 

,但我得到它說「不是一個單一羣組功能」

是否有我應該做一些這方面的其他方法錯誤?

回答

7

你也可以做這樣的:

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; 
8

那麼,你缺少的分組功能;-)

試試這個:

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組合計算所有行。

+0

我願意付出這個+1如果它也明確表名,而不是隱含的;) – MatBailie 2012-04-18 13:27:07

+0

這裏不需要顯式表名。 – 2012-04-18 13:28:08

+0

我嘗試添加「group by user_id」,但我收到消息「不是由表達式組成」。我真的需要添加所有的字段,在我真正的查詢中有很多其他字段我選擇。 – 2012-04-18 13:28:57

1

一個你不想包括所有存在於GROUP BY條款領域的意見狀態。

@Arion發佈了一個相關的子查詢重新賦予相同的值。

以下查詢使用標準(不相關)子查詢(內嵌視圖)來代替。這是因爲使用這個內嵌視圖結構可以經常執行相關子查詢equivilents。但是,也因爲我覺得他們更容易維護。

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的必要,整個表;)