2013-12-17 3 views
0

테이블에서 두 열을 선택하고 다른 열에서 관련 행 수를 선택하고 싶습니다.일부 열과 개수 선택

rem :

rem_id (Int, AI, Index) | rem_name (Varchar) 

map :

나는 테이블 rem의 두 개의 열을 얻으려면
rem_id (Int, AI, Index) | data (Text) 

얼마나 많은 데이터 항목이 저장된 는 기본적으로, 두 개의 테이블을 가지고 각 행에 대해

나는 다음과 같은 쿼리를 사용하려했지만, 그것은 작동하지 않습니다 내가

PostgreSQL을 9.3에서 당신이 행복은 내가이 문제를 해결하는 데 도움이 될 수있어

SELECT 
    rem_id, 
    rem_name, 
    COUNT(
     SELECT map.rem_id 
     FROM map 
     WHERE map.rem_id = rem.rem_id) 
FROM rem; 

?

답변

1
SELECT rem.rem_id, 
     rem.rem_name, 
     COUNT(map.rem_id) as cnt 
FROM rem 
LEFT JOIN map ON map.rem_id = rem.rem_id 
GROUP BY rem.rem_id, rem.rem_name 

rem 열을 기준으로 테이블, 그룹을 연결하는 left join를 사용하여 다음 각 rem 레코드를 셀 수 있습니다.

+1

아니요 'GROUP BY'입니까? – Kermit

+0

하, 당신이 날 때렸어! :) – Kell

+1

모호성을 피하기 위해'rem.rem_id'로 그룹화해야합니다. –

1
SELECT rem_id,rem_name,(SELECT COUNT(map.rem_id) FROM map 
WHERE map.rem_id = rem.rem_id) FROM rem; 
0

기본적으로 세 가지 옵션이 있습니다.

기본 고토 쿼리는 다음과 같습니다 척도로의

SELECT rem.rem_id, 
     rem.rem_name, 
     COUNT(*) as cnt 
FROM rem 
LEFT JOIN map ON map.rem_id = rem.rem_id 
GROUP BY rem.rem_id, rem.rem_name 

생각합니다. 당신이 (partition by 사용) 조항에 의해 여러 그룹에 어떤 금액을 만들 필요가있을 때

SELECT rem.rem_id, 
     rem.rem_name, 
     COUNT(*) OVER (PARTITION BY rem.rem_id) as cnt 
FROM rem 
LEFT JOIN map ON map.rem_id = rem.rem_id 

윈도우 함수는 대부분 유용한에 :

의미 적, 후자는 윈도우 함수를 사용하여 동일한 쿼리와 거의 동일합니다 같은 세트.

A가 하위 쿼리 작업은 일반적으로 행의 수가 제한되는 경우에 조금 더 나은 수행의 상관 관계 미리 선택 :

세 번째이자 마지막 옵션은 remcnt 열을 유지하는 것입니다
SELECT rem.rem_id, 
     rem.rem_name, 
     (SELECT COUNT(*) FROM map WHERE map.rem_id = rem.rem_id) as cnt 
FROM rem 
ORDER BY rem.ren_name LIMIT 10 OFFSET 10 -- As an example 

, map에 트리거를 사용하여 유지 관리하십시오. 이 경우 해당 추가 열을 선택하기 만하면됩니다. 이것은 성능 측면에서 최고의 접근 방식입니다. 사실 cnt으로 주문하려는 경우 실제로 합당한 유일한 방법입니다.

+1

'count()'를 윈도우 함수로 사용하여'group by '의 필수 사용을 제거 할 수도 있습니다 –

관련 문제