2012-04-18 12 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

また、このようにそれを行うことができます。

@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の必要は、ないテーブル全体のためのサブクエリを実行します;)私はこの1の場合を与えるだろう

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; 

最後の行は同じUSER_IDとUSER_NAMEの組み合わせですべての行をカウントするためにOracleに指示しますgroup by句です。あなたはGROUP BY句に存在するすべてのフィールドを含めるようにしたくないあなたのコメント状態の

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; 
+0

それは暗黙的ではなくテーブル名で明示的でした;) – MatBailie

+0

明示的なテーブル名の必要はありません。 –

+0

「group by user_id」を追加しようとしましたが、「式ではないグループ」というメッセージが表示されます。私は本当にすべてのフィールドを追加する必要がありますか、私の実際のクエリには、私が選択している他のフィールドがたくさんあります。 –

関連する問題