2014-04-18 5 views
0

다른 테이블의 내용을 기반으로 새 테이블에 행을 삽입하고 업데이트하는 데 mysql 문에 대한 도움이 필요하다. 자동화 된 펄 코드에서 이것을 사용할 것이지만, mysql 문 자체가 문제가된다. PROFILE 이름mysql은 다른 테이블을 기반으로 문을 업데이트하고 삽입한다.

내 첫 번째 테이블이 같은 같습니다

+----------+---------------------------+ 
| ID  | NAME      | 
+----------+---------------------------+ 
| 0  | Default profile   | 
| 04731470 | Development profile  | 
| 87645420 | Core Base     | 
| a41401a0 | Core Test     | 
| ba0e3000 | Development profile child | 
| e37fe780 | Test2      | 
+----------+---------------------------+ 

을 두 번째 DEPLOYMENT (아무런없이 행)이 열이라고 :

+------------+-------------+------+-----+---------+-------+ 
| Field  | Type  | Null | Key | Default | Extra | 
+------------+-------------+------+-----+---------+-------+ 
| PROF_ID | char(36) | NO | PRI | NULL |  | 
| NAME  | varchar(60) | NO |  | NULL |  | 
| ID   | tinyint(4) | NO | MUL | NULL |  | 
+------------+-------------+------+-----+---------+-------+ 

ID.PROFILEPROF_ID.DEPLOYMENT에 대한 외래 키와 ID.PROFILE에 대한 모든 값을 PROF_ID.DEPLOYMENT에 입력하고 싶습니다. 그런 다음 NAME.PROFILE 필드에있는 단어를 기반으로 NAME.DEPLOYMENTID.DEPLOYMENT 필드를 설정해야합니다.

다음은 내가 삽입 문을 끝까지 수행 할 작업을 보여 주지만,이 때문에 "ERROR 1242 (21000) : 하위 쿼리는 1 개 이상의 행을 반환"실패 난

INSERT INTO DEPLOYMENT(PROF_ID,NAME,ID) VALUES((select ID from PROFILE where NAME like '%core%'),'Core','2'); 
INSERT INTO DEPLOYMENT(PROF_ID,NAME,ID) VALUES((select ID from PROFILE where NAME like '%development%'),'Dev','3'); 
INSERT INTO DEPLOYMENT(PROF_ID,NAME,ID) VALUES((select ID from PROFILE where NAME not like '%development%' and not like '%core%'),'Default','1'); 

이 부분의 업데이트 부분은 어디에서 시작해야할지 모르지만 NAME.PROFILE 필드의 텍스트가 위의 단어로 변경되면 ID.DEPLOYMENTNAME.DEPLOYMENT 필드가 위와 같이 변경되어야합니다.

이것은 내가 찾고있는 테이블입니다.

+----------+---------------+----+ 
| PROF_ID | NAME   | ID | 
+----------+---------------+----+ 
| 0  | Default  | 1 | 
| 04731470 | Dev   | 3 | 
| 87645420 | Core   | 2 | 
| a41401a0 | Core   | 2 | 
| ba0e3000 | Dev   | 3 | 
| e37fe780 | Default  | 1 | 
+----------+---------------+----+ 

그런 다음 NAME.PROFILE 정보가 변경되면 명령문을 업데이트하고 싶습니다.

죄송합니다. 혼란 스럽다면, 설명하는 방법을 모르겠으며 여전히 mysql을 배우고 있습니다. 어떤 도움을 주셔서 감사합니다.

답변

2

그냥 기본적으로 values 키워드를 제거 :

INSERT INTO DEPLOYMENT(PROF_ID,NAME,ID) 
    select ID, 
      (case when NAME like '%core%' then 'Core' 
       when NAME like '%development%' then 'Dev' 
       else 'Default' 
      end) 
      (case when NAME like '%core%' then '2' 
       when NAME like '%development%' then '3' 
       else '1' 
      end) 
    from PROFILE; 
:

INSERT INTO DEPLOYMENT(PROF_ID,NAME,ID) 
    select ID, 'Core','2' 
    from PROFILE 
    where NAME like '%core%'; 

INSERT INTO DEPLOYMENT(PROF_ID,NAME,ID) 
    select ID, 'Dev', '3' 
    from PROFILE 
    where NAME like '%development%'; 

INSERT INTO DEPLOYMENT(PROF_ID,NAME,ID) 
    select ID, 'Default', '1' 
    from PROFILE 
    where NAME not like '%development%' and not like '%core%'; 

그건 그렇고, 당신은 조건식을 이용하여 하나 개의 문장으로 이러한 결합 수

관련 문제