2012-03-03 2 views
1

"user"테이블에 정수 필드 2 개가 있습니다 : leg_count 및 leg_length. 첫 번째는 사용자의 다리 양과 두 번째 다리의 총 길이를 저장합니다.하위 쿼리에서 동일한 테이블을 사용하여 하위 쿼리를 업데이트하십시오.

사용자에 속하는 각 다리까지 전형적인 인터넷 사용자가 무한대 다리에 제로를 가질 수 있습니다, 별도의 테이블에 저장됩니다

: 나는 한 쿼리에서 모든 사용자에 대한 통계를 다시 계산하려면

CREATE TABLE legs (
    user_id int not null, 
    length int not null 
); 

, 그래서

UPDATE users SET 
    leg_count = subquery.count, leg_length = subquery.length 
FROM (
    SELECT COUNT(*) as count, SUM(length) as length FROM legs WHERE legs.user_id = users.id 
) AS subquery; 

및 오류 "동일한 쿼리 수준의 다른 관계를 참조 할 수 없습니다에서 하위 쿼리를"얻을 : 나는보십시오.

SELECT COUNT(*), SUM(length) FROM legs; 

이 가능 최적화하는 것입니다, 필요한 데이터가 하나의 SELECT에서 계산 될 수 있지만

그래서 나는,이 SELECT의 각 행에 대해 수행 할 데이터베이스를 만드는 것

UPDATE users SET 
    leg_count = (SELECT COUNT(*) FROM legs WHERE legs.user_id = users.id), 
    leg_length = (SELECT SUM(length) FROM legs WHERE legs.user_id = users.id) 

을 할 필요가 하나의 SELECT 하위 쿼리 만 사용하는 내 UPDATE 쿼리?

저는 PostgreSQL을 사용합니다. 그러나 저는 그 해결책이 모든 SQL 언어에 존재한다고 생각합니다.

TIA.

답변

7

내가 할 것이다 : 당신은 PostgreSQL을의 extended update syntax 사용할 수

WITH stats AS 
    (SELECT COUNT(*) AS cnt 
      , SUM(length) AS totlength 
      , user_id 
     FROM legs 
     GROUP BY user_id 
    ) 
UPDATE users 
    SET leg_count = cnt, leg_length = totlength 
    FROM stats 
WHERE stats.user_id = users.id 
+0

'users.id'를, 모두를. – Tobu

+1

PostgreSQL 9.1이 필요하다고 언급 했어야합니다. –

3

:

update users as u 
set  leg_count = aggr.cnt 
,  leg_length = aggr.length 
from (
     select legs.user_id 
     ,  count(*) as cnt 
     ,  sum(length) as length 
     from legs 
     group by 
       legs.user_id 
     ) as aggr 
where u.user_id = aggr.user_id 
관련 문제