PostgreSQL의 하위 쿼리에서 업데이트 또는 삽입 (여러 행 및 열)


106

나는 postgres에서 이와 같은 것을 시도하고 있습니다.

  • UPDATE table1 SET (col1, col2) = (SELECT col2, col3 FROM othertable WHERE othertable.col1 = 123);

  • INSERT INTO table1 (col1, col2) VALUES (SELECT col1, col2 FROM othertable)

그러나 포인트 1은 문서 ( http://www.postgresql.org/docs/9.0/static/sql-update.html )에 언급 된 것처럼 postgres 9.0에서도 가능하지 않습니다.

또한 포인트 2는 작동하지 않는 것 같습니다. 다음 오류가 발생합니다. 하위 쿼리는 하나의 열만 반환해야합니다.

누군가 나를 위해 해결 방법이 있기를 바랍니다. 그렇지 않으면 쿼리에 시간이 많이 걸립니다.

참고 : 다른 응용 프로그램이 준비된 데이터를 쉽게 가져올 수 있도록 여러 테이블에서 다른 열을 선택하여 임시 테이블에 저장하려고합니다.

답변:


175

업데이트를 위해

사용하다:

UPDATE table1 
   SET col1 = othertable.col2,
       col2 = othertable.col3 
  FROM othertable 
 WHERE othertable.col1 = 123;

INSERT의 경우

사용하다:

INSERT INTO table1 (col1, col2) 
SELECT col1, col2 
  FROM othertable

VALUESSELECT를 사용하여 INSERT 값을 채우는 경우 에는 구문이 필요하지 않습니다 .


1
업데이트 및 삽입을 결합하여 하나가 실패하면 오류를 발생시키지 않고 다른 하나가 각 행에 대해 독립적으로 사용되도록 할 수 있습니까? 이 질문에 대한 더 완전한 해결책이 될 것이라고 생각합니다 (예 : stackoverflow.com/a/6527838/781695 )
user

26

OMG Ponies의 답변은 완벽하게 작동하지만 더 복잡한 것이 필요한 경우를 대비하여 약간 더 고급 업데이트 쿼리의 예가 있습니다.

UPDATE table1 
SET col1 = subquery.col2,
    col2 = subquery.col3 
FROM (
    SELECT t2.foo as col1, t3.bar as col2, t3.foobar as col3 
    FROM table2 t2 INNER JOIN table3 t3 ON t2.id = t3.t2_id
    WHERE t2.created_at > '2016-01-01'
) AS subquery
WHERE table1.id = subquery.col1;

1
당신은 최고의 :)이야
애쉬 위니

1
완전한. 이것은 업데이트 된 테이블 자체와 관련된 조건에 따라 하위 집합을 선택해야하는 경우 가장 잘 작동합니다.
mythicalcoder

@David Namenyi이 쿼리를 설명해 주시겠습니까?
Chintan Pathak

15
UPDATE table1 SET (col1, col2) = (col2, col3) FROM othertable WHERE othertable.col1 = 123;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.