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

さて、あなたはグループ関数を欠いています;-)

これを試して:

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、同じuser_idとuser_nameの組み合わせを持つすべての行をカウントするようにOracleに指示する句です。

于 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コメントの1つは、句に存在するすべてのフィールドを含めたくないと述べています。

@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 に答える