2008-10-09 3 views
0

SQL 언어 나 MySQL (또는 다른 DBMA)에서 한 셀에서 다른 셀로 값을 전송할 수있는 방법이 있습니까? 예를 들어, 다음과 같은 구조로 user_cars라는 테이블이 말 :한 셀에서 다른 셀로 값을 전송하는 방법은 무엇입니까?

|id| |user_name| |num_cars| 

밥이 5 차를 가지고가, 요한 3 차있다. 어떤 검색어로 Bob에게서 2 대를 뺀 다음 John에 2를 더하는 방법이 있습니까? 두 가지 업데이트 쿼리를 사용하여이 작업을 수행 할 수 있음을 알고 있지만 더 효율적인 방법이 있는지 알고 싶습니다. 당신이 정말로 하나 개의 쿼리에서 그것을하고 싶은 경우 트랜잭션에 대한 ...

답변

4

오라클의 경우이 작업을 수행 할 수 있습니다. mysql에 상응하는 것이 있는지 모른다. 분명히이 특별한 진술은 당신이 진술 한 예문에 매우 구체적입니다.

UPDATE user_cars 
    SET num_cars = num_cars + 
        CASE WHEN user_name='Bob' THEN -2 
          WHEN user_name='John' THEN +2 
        END 
    WHERE user_name IN ('Bob', 'John') 
1

테이블의 조인,하지만 덜 읽을 수 아마도 덜 효율적 모두입니다.

0

무엇인지, 당신이 자기에 대한 업데이 트를 할 수있어

2

이 작동하지만 즐거운되지 않습니다 :

내가 조나스 Klemming에 동의
UPDATE USER_CARS UC 
SET 
    NUM_CARS = NUM_CARS + CASE WHEN UC.USER_NAME = 'Bob' 
          THEN -2 --take from bob 
          WHEN UC.USER_NAME = 'John' 
          THEN 2 --give to John 
          ELSE 0 --no change for anybody else 
         END 
+0

WHERE 절을 사용하여 업데이트되는 행의 수를 제한해야합니다 (Bob 및 John 만). 0을 추가하면 같은 값이되지만 트랜잭션 로그, 트리거 등에 대한 변경 사항으로 계산됩니다. 행 수가 많은 테이블은 성능이 저하됩니다. – JeremyDWill

0

는 그 일의 의미있는 방식이 밤은. 이것은 정확히 거래가 발명 된 것입니다.

1

다른 사람들이 설명했듯이 CASE 문으로 수행 할 수 있습니다.
그러나 그렇게하는 것은 현명하지 않을 것입니다. 왜냐하면 코드의 의도를 쉽게 알 수 없기 때문입니다. 이렇게하면 후속 프로그래머가 코드의 목적을 이해하는 것이 더 어려워집니다.

하나의 문장에서 특정 작업을 수행해야하는 특별한 이유가없는 한 가장 좋은 방법은 2 개의 업데이트 구문을 사용하여 필요한 경우 트랜잭션에 배치하는 것입니다. (나는 wikiquote의 속성 조회 할 수 있었더라도)

나는 자주 인용을 기억 : ". 사람들이 읽을 프로그램이 작성되어야하며, 단지 부수적 기계 실행하기위한"

을 - Abelson & Sussman, SICP, 초판 머리글

관련 문제