2011-07-28 2 views
0

우선 스키마는 내 것이 아닙니다. 그것은 끔찍하고 혼란 스럽습니다. 그리고 경고 - 이것은 복잡합니다.WHERE의 결과에 기반한 INSERT INTO JOIN

나는 3 개의 테이블 - tbl_a, tbl_btbl_c을 가지고 있습니다. switch은 실제로 엔터티 (레코드)의 속성 인 tbl_a입니다. 그러나 다음 tbl_ctbl_bJOIN 및 통해서만 접근 :

+---------+   +---------+   +---------+ 
    | tbl_a |   | tbl_b |   | tbl_c | 
    +---------+   +---------+   +---------+ 
    | a_id | +--> | b_id | +--> | c_id | 
    | b_fk | <--+ | c_fk | <--+ | switch | 
    +---------+   +---------+   +---------+ 

    +---------+ 
    | tbl_his | 
    +---------+ 
    | his_id | 
    | a_fk | 
    | coef | 
    +---------+ 

내가 네 번째 테이블 (tbl_his)을 만들 필요가 기능을 추가하려면 - 내가 했어요. 이 테이블에는 coef 열이 있으며 1에서 100까지의 숫자를 사용할 수 있습니다. tbl_a 레코드 당 tbl_his 레코드 하나를 채워야합니다. 현재 데이터가 switch이면 0 또는 1입니다. 기록을 위해 스위치가 1 인 경우 0의 관련 switchtbl_a의 각 레코드에 대한

나는 tbl_his에 다음 레코드를 추가해야
NULL, 'a_id', '100'

tbl_his에 레코드를 추가해야합니다 :
NULL, 'a_id', '50'

이 쿼리는 작업의 절반을 수행합니까? 50 레코드와 100 레코드를 한 번에 수행하는 방법은 무엇입니까?

INSERT INTO `tbl_his` (`his_id`, `a_fk`, `coef`) VALUES (NULL, 'tbl_a.id', '100') 
WHERE (
SELECT tbl_a.id 
FROM tbl_a 
LEFT JOIN tbl_b ON tbl_a.b_fk = tbl_b.id 
LEFT JOIN tbl_c ON tbl_b.c_fk = tbl_c.c_id 
WHERE tbl_c.switch = '0') 
+0

구문이 유효하지 않습니다. VALUES()리스트 다음에'WHERE'가 없어야합니다. 또한'FROM \'tbl_a'에 역 인용 부호가 없습니다. –

답변

3

INSERT INTO...WHERE 쿼리 구문과 같은 것은 없습니다. 원하는 것은 INSERT INTO...SELECT입니다.

INSERT INTO 
    tbl_his (a_fk, coef) 
SELECT 
    tbl_a.id, 
    CASE WHEN tbl_c.switch = 0 THEN 100 ELSE 50 END 
FROM 
    tbl_a 
LEFT JOIN 
    tbl_b 
ON 
    tbl_a.b_fk = tbl_b.id 
LEFT JOIN 
    tbl_c 
ON 
    tbl_b.c_fk = tbl_c.c_id 

MySQL Manual :: Control Flow Functions

+0

감사합니다. 그래서 여기서'SELECT'는'VALUES'의 일을합니까? –

+1

예. SELECT 쿼리의 결과가 삽입됩니다. 반환되는 행이 삽입됩니다. 나는 모든 것을 설명하는 매뉴얼 페이지에 링크했다. –

+1

+1하지만 CASE 스위치를 쓰는 기회를 놓친 경우 ...;) –

1

드롭에 조인 좌. where 절은 불법적 인 장소에 있습니다. 쿼리의 값을 삽입하고 coef를 계산하십시오. 모든 스위치 값이 0 또는 1이면 마지막 행을 삭제할 수 있습니다.

INSERT INTO tbl_his (his_id, a_fk, coef) 
    SELECT NULL, tbl_a.id, 100-50*tbl_c.switch 
    FROM tbl_a 
    JOIN tbl_b ON tbl_a.b_fk = tbl_b.id 
    JOIN tbl_c ON tbl_b.c_fk = tbl_c.c_id 
    WHERE switch BETWEEN 0 AND 1; 
관련 문제