2012-04-26 2 views
1

다른 테이블의 일부 값의 합계를 기반으로 테이블의 여러 레코드를 업데이트해야합니다. 여기 내 쿼리가 있습니다 :중첩 조인이 작동하지 않는 업데이트 문

UPDATE aallinnot2 c SET c.Energ_Kcal = (SELECT d.id1, SUM(c.Energ_Kcal) 
FROM aaingred a 
LEFT JOIN aaweight b ON a.unit = b.uni 
LEFT JOIN aallinnot2 c ON a.mfdfsds = c.NDB_No 
LEFT JOIN aalinfsds d ON a.fsdsnum = d.id1 
WHERE d.own_id =42 
GROUP BY id1) 
WHERE c.NDB_No 
IN ( SELECT DISTINCT `fsdsnum` 
FROM `aaingred` 
WHERE `usernum` LIKE '42' 
) 

MySQL said: 

#1093 - You can't specify target table 'c' for update in FROM clause 

불행히도, 나는 어떻게 목표 테이블 'c'를 참조하지 않고 내 값을 얻을 줄 모르겠다! 이 문제를 해결할 수있는 방법이 있습니까?

답변

0

나는 MySQL의에 대해 잘 모르겠지만, SQL Server와 문은 다음과 같이 될 것이다 : 당신은 테이블이 UPDATE 절에 업데이트 될 별칭을 수 없습니다

UPDATE aallinnot2 
    SET Energ_Kcal = ( 
    SELECT SUM(c.Energ_Kcal) 
    FROM aaingred a 
    LEFT JOIN aaweight b ON a.unit = b.uni 
    LEFT JOIN aallinnot2 c ON a.mfdfsds = c.NDB_No 
    LEFT JOIN aalinfsds d ON a.fsdsnum = d.id1 
    WHERE d.own_id =42) 
    WHERE c.NDB_No 
    IN ( SELECT DISTINCT `fsdsnum` 
    FROM `aaingred` 
    WHERE `usernum` LIKE '42') 

,하지만 당신은에서와 수 FROM 절.

+0

을 고정하지만, 필드를 업데이트하는 하위 쿼리가 하나의 행과 하나의 열을 반환해야합니다. – newtover

+0

에도 여전히 같은 오류가 발생합니다. "# 1093 - FROM 절" – Nat

+0

Good spot newtover "에서 대상 테이블 'aallinnot2'를 업데이트 할 수 없습니다. 그에 따라 편집했습니다. Nathaniel - 여기 내 깊이가 없다고 생각합니다. SQL Server가 이와 관련하여 작업 할 것이라고 확신합니다. –

1

미친 테이블/열 이름과 해독 할 수없는 논리로 인해, 내가 본 중에 가장 추한 쿼리 일 수 있습니다. 축하해. :)

나는 다음과 (또는이 접근 방식) 작동합니다 생각합니다. 주요 문제는 group-by 표현식의 풀기 작업이었습니다. 대상 테이블의 각 행이 해당 행의 업데이트 된 값을 포함하는 집합에 조인되는 데이터 집합을 데이터베이스 엔진에 제공해야합니다. 여기에서 하위 쿼리에서 새 값을 선택한 다음 해당 하위 쿼리를 원래 테이블에 조인합니다.

편집 내가 SQL 서버에 대한 확실하지 오전 일부 구문

UPDATE 
    (
    SELECT d.id1, SUM (c.Energ_Kcal) AS Sum_Energ_Kcal 
     FROM aaingred a 
      LEFT JOIN aaweight b ON a.unit = b.uni 
      LEFT JOIN aallinnot2 c ON a.mfdfsds = c.NDB_No 
      LEFT JOIN aalinfsds d ON a.fsdsnum = d.id1 
     WHERE d.own_id =42 
     GROUP BY id1 
    ) d 
    ,aaingred a, aallinnot2 d 
    SET Energ_Kcal = d.Sum_Energ_Kcal 
    WHERE d.id1 = a.fsdsnum 
    AND a.mfdfsds = aallinnot2.NDB_No 
    AND c.NDB_No IN (
     SELECT DISTINCT `fsdsnum` 
     FROM `aaingred` 
     WHERE `usernum` LIKE '42' 
    ); 
+0

# 1064 - SQL 구문에 오류가 있습니다. 올바른 구문을 보려면 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. 'FROM (SELECT d.id1, ​​SUM (c.Energ_Kcal) AS Sum_Energ_Kcal FROM aaingred a'on line 1 근처에서 사용하십시오. – Nat

+0

다른 균열이 있음 ... 나는 이것이 올바른 구문이라고 생각한다. – McGarnagle