2016-07-26 3 views
1

나는 3 개의 테이블을 가지고있다. 하나는 내 선수 테이블, 역사 테이블 및 항목 테이블입니다.단일 선택을 두 개의 다른 테이블에 삽입하는 방법은 무엇입니까?

플레이어 테이블이 이미 히스토리 테이블에있는 경우 플레이어 테이블을 확인해야합니다. 그렇지 않으면 히스토리 테이블에 삽입 한 다음 항목 테이블 (다른 삽입)에 하나의 항목을 제공해야합니다.

이미이 코드가 있지만 하나의 선택에 대해 두 개의 다른 삽입을 실행하는 방법을 모르겠지만 모두 검색했지만 어쩌면 IF와 THEN을 사용해야합니까? 첫 번째 테이블의 삽입에 삽입 할 때 그렇게 할수 없어

INSERT INTO tb_item (player_id, friend_id, item_id) 
SELECT 1, id, 101 FROM tb_player 
WHERE vip = 1 
AND creation_date BETWEEN now() - INTERVAL '2 year' AND now() - INTERVAL '1 years' 
AND id NOT IN ( SELECT ig.player_id FROM tb_history ig WHERE ig.item_id = 101 
+0

같은 Common Table Expressions를 사용하여 삽입 만 할 수있는 스토위한 작업 같은이 소리 빨간색 절차 – AntDC

+1

나는 당신이 원하는 것을 이해하기가 힘듭니다. 질문을 편집하고 샘플 데이터와 해당 데이터를 기반으로 예상되는 출력을 추가하십시오. _Formatted_ text please, [스크린 샷 없음] (http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a- 질문/285557 # 285557) 쓰기 가능한 CTE가 찾고있는 것처럼 들립니다. https://www.postgresql.org/docs/current/static/queries-with.html#QUERIES-WITH-MODIFYING –

답변

0

, 당신은 테이블에 대한 트리거를 사용하여, 그것을 만들기 위해 두 개의 삽입 한 Statment, 다른 방법을 사용해야합니다 : 여기

내 쿼리입니다 두 번째 테이블 자동으로 (뿐만 아니라 다른 삽입 문)

+1

그것은 2 INSERT 문을 사용하여 괜찮아요하지만 같은 일을 두 번 tb_player를 선택하고 싶지 않아, 난 그냥 그 다음 두 테이블에 삽입 삽입 해야하는 경우 확인하고 싶지 거기에 방법을? –

+0

임시 테이블을 사용할 수 있지만 임시 테이블의 결과를 가져온 다음 2 개의 대상 테이블에 두 개의 삽입을 수행합니다. SQL이 느리거나 두 번째 호출시 SQL이 다른 결과를 반환 할 수있는 경우이 방법이 좋습니다 3 삽입 문. –

1

당신은 내가 위해 Postgress 사용한 적이이

WITH inserted_item AS (
    INSERT INTO tb_item (player_id, friend_id, item_id) 
    SELECT 1, id, 101 FROM tb_player 
    WHERE vip = 1 
    AND creation_date BETWEEN now() - INTERVAL '2 year' 
    AND now() - INTERVAL '1 years' 
    AND id NOT IN (
     SELECT ig.player_id FROM tb_history ig WHERE ig.item_id = 101 
    ) 
    RETURNING * 
) 
INSERT INTO tb_history (some_col1, some_col2, some_col3) 
SELECT player_id, friend_id, item_id 
FROM inserted_item 
관련 문제