2010-05-16 3 views
5

가정하자 나는 MySQL의이 모양을 MyTable라는 테이블이 각 Id, 나는 형 C 그와 함께 새 행을 삽입 할,삽입 새 행

+----+------+-------+ 
| Id | Type | Value | 
+----+------+-------+ 
| 0 | A |  1 | 
| 0 | B |  1 | 
| 1 | A |  2 | 
| 1 | B |  3 | 
| 2 | A |  5 | 
| 2 | B |  8 | 
+----+------+-------+ 

Value은 같은 Id의 행에 대해 AB 값의 합계입니다. 이 테이블의 기본 키는 (Id, Type)이므로 ID, 유형 쌍이 중복되지는 않습니다.

내가이 쿼리에 원하는 행을 만들 수 있습니다

SELECT MyTable_A.Id AS Id, 'C' AS Type, (A_Val + B_Val) AS Value FROM 
     (SELECT Id, Value AS A_Val FROM MyTable WHERE Type='A') AS MyTable_A 
    JOIN (SELECT Id, Value AS B_Val FROM MyTable WHERE Type='B') AS MyTable_B 
    ON MyTable_A.Id = MyTable_B.Id 

기부 :

+----+------+-------+ 
| Id | Type | Value | 
+----+------+-------+ 
| 0 | C |  2 | 
| 1 | C |  5 | 
| 2 | C | 13 | 
+----+------+-------+ 

하지만 질문은 : 나는 삽입이 결과를 사용합니까 어떻게 C 행 붙이 생성 MyTable에?

쿼리를 사용하여이 작업을 수행하는 비교적 간단한 방법이 있습니까? 아니면 저장 프로 시저를 작성해야합니까? 후자의지도가 도움이된다면, 나는 그들에게 너무 잘 정통하지 않습니다.

+0

이렇게하면 데이터가 비정형 화됩니다. 왜 이걸하고 싶어? A와 B가 바뀌면 어떻게 될까요? 누군가가 C를 수정할 수 있습니까? –

+0

이것이 필요한 이유는'C'가'A + B'로 정의되어 있고 테이블의 모든 항목이 현재'A'와'B' 값을 가지고 있기 때문에'C' 만 알려진 미래 항목이있을 것입니다 'A'와 'B'구성 요소에 대한 분석을 결정할 방법이없는 곳입니다. 이것이 의미하는 바는,'A'와'B' *가 알려진'Id '에 대한 삽입과 업데이트를 위해'C = A + B'를 보장하는 외부 검증 로직을 구현해야한다는 것을 의미합니다. –

답변

4

. 예를 들어 :

insert into MyTable (Id,Type,Value) 
    select MyTable_A.Id, 'C', (A_Val + B_Val) from ... 

쿼리가 실제로 올바른지 가정 - 그 :-) 또 다른 예로서

의 더 평가,

insert into MyTable (Id,Type,Value) 
    select Id+1000, 'C', Value from MyTable where Type = 'A' 

다음 행을 추가하지 않습니다 :

+------+------+-------+ 
| Id | Type | Value | 
+------+------+-------+ 
| 1000 | C |  1 | 
| 1001 | C |  2 | 
| 1002 | C |  5 | 
+------+------+-------+ 
+0

우수! 간단하고 심지어 선제 적으로 "테이블에 다른 열이 있으면 기본값을 사용하고 싶습니다"라는 질문에 대한 내 대답을 미리 대답했습니다. –

2

다만 당신의 선택 문 앞에 다음 줄을 추가합니다 : 당신은 그냥 그 선택 삽입에 (약간 "당신이 as 절을 필요로하지 않는다"같이 수정) 추가 할 수 있습니다

INSERT MyTable (Id, Type, Value)