2017-04-26 7 views
2

여기 내 생각을 잃어 가고 있습니다. Table1의 특정 하위 집합을 업데이트하려고합니다. SELECTTable1에서 1 백만 행을 반환한다고 가정 해 보겠습니다. 각 행에 대해 Table2의 특정 계산 된 금액을 교차 적용하고자합니다.SQL - CROSS APPLY가 제대로 작동하지 않습니다.

Table1의 모든 행이 Table2의 조건에 CROSS APPLY 부분으로 결합 될 수있는 것은 아니라는 사실을 알고 있습니다.

업데이트에서 여전히 1,000,000 개의 행이 영향을 받았다고합니다. 이 후 나는 의심스러워하고 CROSS APPLY에 '1 = 0'조건을 추가하여 결코 행을 반환 할 수 없었습니다.

그러나 여전히 모든 행이 Table1에 업데이트됩니까?

UPDATE T1 
SET T1.Field1 = T2.SumField 
FROM 
    (
     SELECT * 
     FROM Table1 
     WHERE .... 
    ) T1 
CROSS APPLY 
    (
     SELECT SUM(Field1) SumField 
     FROM Table2 
     WHERE [A lot of Fields] = [Some Values from T1] 
     AND 1 = 0 -- !!! 
    ) T2 

왜 이런 일이 발생하는지 알고 계십니까?

+1

가하는'INNER' 또는 무슨 문제의 영향을받을 것'LEFT 가입 '여기? 나는 당신의'모든 1 = 0'이 NULL을 반환했다고 말하고 싶습니다 ... – Shaneis

+0

Microsoft는 당신의 타이틀에 대해 기분이 좋지 않을 것입니다. : P – Sankar

답변

1

두 번째 쿼리가 null 집합이 아닙니다. 결과와 조인 된 하나의 값 NULL을 반환합니다.

UPDATE T1 
SET T1.Field1 = T2.SumField 
FROM 
     (
     SELECT * 
     FROM Table1 
     WHERE .... 
    ) T1 
CROSS APPLY 
    (
     SELECT Field1 SumField 
     FROM Table2 
     WHERE [A lot of Fields] = [Some Values from T1] 
     AND 1 = 0 -- !!! 
    ) T2 

이 0 행은`이것에 대한 CROSS APPLY`를 사용하는 이유를 잘 모르겠어요 (예고없는 SUM)

+1

네, 맞습니다. SUM 집계를 사용하면 NULL 열을 반환합니다. 고마워, 이건 내 성격을 복원하는 데 도움 :) – Koruba