하위 쿼리를 통해 업데이트하십시오. 하위 쿼리가 행을 반환하지 않으면 어떻게됩니까?

StackOverflow https://stackoverflow.com/questions/1829311

문제

업데이트에서 하위 쿼리를 사용하고 있습니다.

UPDATE tableA 
SET x,y,z = ( (SELECT x, y, z 
               FROM tableB b
               WHERE tableA.id = b.id
                 AND (tableA.x != b.x
                      OR tableA.y != b.y
                      OR tableA.z != b.z))) );

내 질문은 하위 쿼리가 행을 반환하지 않으면 어떻게됩니까? Nulls로 업데이트됩니까?

둘째, 이것을 쓰는 더 좋은 방법이 있습니까? 기본적으로 TableB의 Tablea에서 세 개의 필드를 업데이트하고 있지만 업데이트는 세 필드 중 하나가 다른 경우에만 발생해야합니다.

도움이 되었습니까?

해결책

서브 쿼리가 행을 반환하지 않으면 어떻게됩니까? Nulls로 업데이트됩니까?

예- 다음과 같이 테스트 할 수 있습니다.

update YourTable
set col1 = (select 1 where 1=0)

이것은 col1을 널로 채 웁니다. 서브 쿼리가 다음과 같은 여러 행을 반환하는 경우 :

update YourTable
set col1 = (select 1 union select 2)

데이터베이스는 오류가 발생합니다.

둘째, 이것을 쓰는 더 좋은 방법이 있습니까? 기본적으로 TableB의 Tablea에서 세 개의 필드를 업데이트하고 있지만 업데이트는 세 필드 중 하나가 다른 경우에만 발생해야합니다.

직관적으로 나는 성능에 대해 걱정하지 않을 것입니다. 실제로 업데이트를 피하려면 다음과 같이 쓸 수 있습니다.

UPDATE a
SET x = b.x, y = b.y, z = b.z
FROM tableA a, tableB b 
WHERE a.id = b.id AND (a.x <> b.x OR a.y <> b.y OR a.z <> b.z)

그만큼 WHERE 절은 NULL로 업데이트를 방지합니다.

다른 팁

Informix에서 사용한 Andomar의 솔루션의 변형 :

UPDATE a
SET x,y,z = ( (SELECT x, y, z 
               FROM tableB b
               WHERE tableA.id = b.id) )
WHERE tableA.id IN (SELECT fromTable.id
                    FROM tableA toTable, tableB fromTable
                    WHERE toTable.id = fromTable.id
                      AND ((toTable.x <> fromTable.x) 
                           OR (toTable.y <> fromTable.y)
                           OR (toTable.z <> fromTable.z))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top