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

당신은 이런 식으로 그것을 할도 수 : 당신이 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; 
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의 조합으로 모든 행을 계산하는 오라클을 알려주는 group by 절입니다 .

+0

암시 적이기보다는 테이블 이름이 명시 적 임) – MatBailie

+0

명시 적 테이블 이름이 필요 없습니다. –

+0

"group by user_id"를 추가하려고 시도했지만 "표현에 의한 그룹이 아닙니다"라는 메시지가 나타납니다. 실제 필드에 모든 필드를 추가해야합니까, 실제로 선택하는 다른 필드가 많이 있습니다. –

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의 필요, 하지 전체 테이블의 하위 쿼리를 실행) 나는이 일 경우를 줘야 할 것

관련 문제