2011-02-04 3 views
2

다음 쿼리를 가지고 있는데 총계로 table1을 업데이트하려고합니다. 어쨌든 1 단계에서이 작업을 수행합니까?조인과 그룹으로 쿼리 업데이트

select e.id 
    , p.id 
    , case 
     when count(distinct e.item) = 1 then 100 
     when count(distinct e.item) = 2 then 150 
     when count(distinct e.item) = 3 then 200 
     when count(distinct e.item) = 4 then 225 
     when count(distinct e.item) = 5 then 275 
     when count(distinct e.item) = 6 then 325 
     when count(distinct e.item) = 7 then 375 
     when count(distinct e.item) = 8 then 450 
     when count(distinct e.item) = 8 then 470 
     end as TotalPay 
    from table1 p 
    join table2 e on e.id = '111111' 
       and p.id=e.itemid 
group by e.id, p.id 

답변

3

사용 : 절은 필요

UPDATE TABLE1 
    SET total = (SELECT CASE 
         WHEN COUNT(DISTINCT t2.item) = 1 THEN 100 
         WHEN COUNT(DISTINCT t2.item) = 2 THEN 150 
         WHEN COUNT(DISTINCT t2.item) = 3 THEN 200 
         WHEN COUNT(DISTINCT t2.item) = 4 THEN 225 
         WHEN COUNT(DISTINCT t2.item) = 5 THEN 275 
         WHEN COUNT(DISTINCT t2.item) = 6 THEN 325 
         WHEN COUNT(DISTINCT t2.item) = 7 THEN 375 
         WHEN COUNT(DISTINCT t2.item) = 8 THEN 450 
         WHEN COUNT(DISTINCT t2.item) = 9 THEN 470 
         END 
        FROM TABLE2 t2 
       WHERE t2.itemid = id 
        AND t2.id = '111111' 
       GROUP BY t2.id, t2.itemid) 
WHERE EXISTS(SELECT NULL 
       FROM TABLE2 t 
       WHERE t.itemid = id 
       AND t.id = '111111') 
  • 제 1, 그렇지 않으면 모든 TABLE1 행이 처리됩니다. 관련 테이블 2 행이없는 사람들은 NULL
  • 으로 업데이트되었습니다. (최대 10g의 IME, 최대 10g)는 &과 같은 UPDATE 절에서 JOIN을 지원하지 않습니다. SQL Server - 하위 쿼리를 사용해야합니다. (이 예와 관련). 또한 업데이트중인 테이블에 대한 테이블 별칭을 정의 할 수 없으므로 예제에서 보는 것처럼 테이블 별칭이 생략 된 경우 - 별칭 (업데이트되는 테이블)이없는 테이블에서 열이 전달되는 경우
+0

EXISTS 아래의 subselect에서 WHERE 절에'id'가'TABLE1' 접두사가 있어서는 안됩니까? 그리고 다른 subselect에 대해서도 마찬가지입니다. –

+0

@Andriy M : 가능 합니다만, 그 답은 이미 옵티마이 저가 테이블 별칭이없는 열 참조가 제대로 연관되어 있다고 설명합니다. –

+0

나는 그 점을 간과했다, 나에 수치. 죄송합니다. –

1

시도 : 표 2 일치가없는 경우에도 의견에서 지적 된 바와 같이

update table1 p 
set TotalPay = 
(
select case 
     when count(distinct e.item) = 1 then 100 
     when count(distinct e.item) = 2 then 150 
     when count(distinct e.item) = 3 then 200 
     when count(distinct e.item) = 4 then 225 
     when count(distinct e.item) = 5 then 275 
     when count(distinct e.item) = 6 then 325 
     when count(distinct e.item) = 7 then 375 
     when count(distinct e.item) = 8 then 450 
     when count(distinct e.item) = 8 then 470 
     end as TotalPay 
    from table2 e where p.id=e.itemid 
       and e.id = '111111' 
) 

, 위에서 테이블 1의 모든 행을 업데이트 할 것 - 그것은 NULL에 열을 설정합니다있는가. WHERE 절을 추가하지 않으려면 - OMGPonies의 대답을 참조하십시오.

+1

일치하는'e.itemid' 레코드가 없을 때 NULL을 쓰지 않습니까? –

+0

@OMG 조랑말, 그렇습니다 – Ronnis

+0

@OMG 조랑말, nulls로 덮어 쓰는 바로 그 문제의 나쁜 추억에서 회복되면 당신의 upvote을 가지고 있습니다 :) – Ronnis