카테고리 없음

[SQL] SQL 업데이트 문을 단일 문으로 결합하는 방법

행복을전해요 2021. 2. 2. 14:30

단일 업데이트로이를 수행 할 수 있습니다.

UPDATE SalesSummary
  SET FamilySales = SalesSummary.FamilySales + (case when bx.Family = p.Family then p.FamilySale else 0 end),
        CityTotal = SalesSummary.FamilyTotal + p.FamilyTotal
        FROM DailySalesSummary p,
             Reference bx
             WHERE SalesSummary.Person = bx.Person
               AND bx.City = p.City
                 AND SalesSummary.Year = p.Year;
                 

이는 조건 FamilySales과 일치하지 않는 행에서 자체적으로 설정 됩니다 bx.Family = p.Family. 그러나 두 쿼리와 동일한 효과가 있어야합니다.

편집하다:

다음은 보유한 데이터에서 작동하는 것 같습니다.

UPDATE ss 
    set FamilySales = ss.FamilySales + dss.FamilySales,
            CitySales = ss.CitySales + dss.CitySales
            FROM SalesSummary ss join
                 DailySalesSummary dss
                      on ss.Person = dss.Person and
                              ss.City = dss.City
                                      ss.Family = dss.Family;
                                      

bx테이블에 조인이있는 이유를 이해할 수 없습니다 . 걸러 내고 싶다면 여전히 할 수 있습니다.

내가 알 수있는 한,의 데이터는 DailySalesSummary업데이트해야하는 항목과 일치하므로 간단한 join것은 올바른 행을 함께 가져옵니다.

-------------------

실제로 UPDATE하나의 UPDATE문으로 테이블을 두 개 이상 사용할 수 없습니다 . 자세한 내용은 Stack Overflow 답변 에서 찾을 수 있습니다 .

업데이트중인 모든 열이 동일한 테이블에 있고 동일한 소스 테이블에서 가져온 경우 다음과 같이 간단히 여러 열을 업데이트 할 수 있습니다.

UPDATE SalesSummary 
  SET FamilySales = SalesSummary.FamilySales + p.FamilySales,
        CityTotal = SalesSummary.FamilyTotal + p.FamilyTotal
        FROM DailySalesSummary p,
             Reference bx
             WHERE SalesSummary.Person= bx.Person
               AND bx.City = p.City
                 AND bx.Family = p.Family
                   AND SalesSummary.Year = p.Year
                   

SQL 2000-스타일 조인 은 권장하지 않지만 . 재 작업은 다음과 같습니다.

UPDATE SalesSummary
SET FamilySales = SalesSummary.FamilySales + p.FamilySales,
    CityTotal = SalesSummary.FamilyTotal + p.FamilyTotal
    FROM
        DailySalesSummary p
            JOIN Reference bx ON bx.City = p.City
                 AND bx.Family = p.Family
                 WHERE
                     SalesSummary.Year = p.Year
                         AND SalesSummary.Person = bx.Person
                         

업데이트 된 답변

UPDATE s
SET
    s.FamilySales = s.FamilySales + fam.FamilySales,
        s.CitySales = s.CitySales + city.CitySales
        FROM
            SalesSummary s
                JOIN Reference r ON r.Person = s.Person
                    JOIN (SELECT DISTINCT Year, Family, FamilySales FROM DailySalesSummary) fam ON fam.Family = r.Family AND fam.Year = s.Year
                        JOIN (SELECT DISTINCT Year, City, CitySales FROM DailySalesSummary) city ON city.City = r.City AND city.Year = s.Year
                        

여기 SQLFiddle에서 작업 예제를 볼 수 있습니다 .



출처
https://stackoverflow.com/questions/22049921