복붙노트

[SQL] 또 다른 하나의 필드에서 하나 개의 테이블의 SQL 업데이트 필드

SQL

또 다른 하나의 필드에서 하나 개의 테이블의 SQL 업데이트 필드

나는 두 개의 테이블이 있습니다

A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]

B의 항상있을 것입니다 일부 (A의 모든 열을 의미 B도 있습니다).

나는이 ID는 A와 B에 모두 존재하는 A의 모든 열에 대한의 데이터와 B의 특정 ID를 가진 레코드를 업데이트 할

대해 UPDATE 구문이나, 다만 "A의 모든 열을 설정합니다"라는 열 이름을 지정하지 않고 그렇게 할 수있는 다른 방법이 있습니까?

특정 비표준 명령도 허용됩니다, 그래서 나는, PostgreSQL을 사용하고 있습니다 (단, 바람직하지).

해결법

  1. ==============================

    1.당신은 FROM 절 비표준를 사용할 수 있습니다.

    당신은 FROM 절 비표준를 사용할 수 있습니다.

    UPDATE b
    SET column1 = a.column1,
      column2 = a.column2,
      column3 = a.column3
    FROM a
    WHERE a.id = b.id
    AND b.id = 1
    
  2. ==============================

    2.문제는 오래 그러나 나는 가장 좋은 대답은 아직 제공되지 않은 느꼈다.

    문제는 오래 그러나 나는 가장 좋은 대답은 아직 제공되지 않은 느꼈다.

    당신은 몇 가지 독특한 컬럼 (들) (예에서 ID를)에 가입 제외한 모든 열 이름을 알 필요가 없습니다. 내가 생각할 수있는 모든 가능한 코너의 경우에 안정적으로 작동합니다.

    이것은 PostgreSQL을 특정한다. 나는 (오라클 제외) SQL 표준 및 대부분의 주요 RDBMS에 정의 된 테이블 INFORMATION_SCHEMA.COLUMNS는, 그것을 가지고 특히하여 INFORMATION_SCHEMA에 따라 동적 코드를 건물입니다. 그러나 PL / pgSQL의 코드 실행을 동적 SQL과 DO 문은 완전히 표준이 아닌 PostgreSQL의 구문입니다.

    DO
    $do$
    BEGIN
    
    EXECUTE (
    SELECT
      'UPDATE b
       SET   (' || string_agg(        quote_ident(column_name), ',') || ')
           = (' || string_agg('a.' || quote_ident(column_name), ',') || ')
       FROM   a
       WHERE  b.id = 123
       AND    a.id = b.id'
    FROM   information_schema.columns
    WHERE  table_name   = 'a'       -- table name, case sensitive
    AND    table_schema = 'public'  -- schema name, case sensitive
    AND    column_name <> 'id'      -- all columns except id
    );
    
    END
    $do$;
    

    다른 방법으로 라운드 A의 각 열에 대해 B에 일치하는 열을 가정하지만. B 열을 추가 할 수 있습니다.

    b.id = 123은 선택 사항이고, 선택된 행을 업데이트합니다.

    SQL 바이올린.

    더 설명과 함께 관련 답변 :

    당신은 여전히 ​​두 테이블 모두가 공유하는 열 이름의 목록을 알 필요가있다. 다른 답변은 지금까지 어떤 경우에 어떤 제안보다 짧은 - 여러 열을 업데이트하기위한 구문 바로 가기.

    UPDATE b
    SET   (  column1,   column2,   column3)
        = (a.column1, a.column2, a.column3)
    FROM   a
    WHERE  b.id = 123    -- optional, to update only selected row
    AND    a.id = b.id;
    

    SQL 바이올린.

    이 구문은 질문 질문을 받았다 오래 전에, 2006 년 포스트 그레스 8.2에서 도입되었습니다. 매뉴얼의 세부 사항.

    관련 :

    (A)의 모든 열을 NOT NULL 정의 (그러나 반드시 B)하는 경우, 당신은 B (그러나 반드시 A)의 열 이름을 알고있다.

    UPDATE b
    SET   (column1, column2, column3, column4)
        = (COALESCE(ab.column1, b.column1)
         , COALESCE(ab.column2, b.column2)
         , COALESCE(ab.column3, b.column3)
         , COALESCE(ab.column4, b.column4)
          )
    FROM (
       SELECT *
       FROM   a
       NATURAL LEFT JOIN  b -- append missing columns
       WHERE  b.id IS NULL  -- only if anything actually changes
       AND    a.id = 123    -- optional, to update only selected row
       ) ab
    WHERE b.id = ab.id;
    

    자연 LEFT 동일한 이름의 모든 열이 동일한 값을 유지 (B)로부터 합류 행 JOIN. 우리는이 경우 (아무것도 변경)에 업데이 트를 필요로하지 않으며 (b.id은 NULL입니다) 프로세스 초기에 해당 행을 제거 할 수 있습니다. 우리는 여전히 외부 쿼리에 너무 b.id = ab.id, 일치하는 행을 찾을 필요가있다.

    DB <> 바이올린 여기 올드 sqlfiddle.

    이것은 FROM 절을 제외하고 표준 SQL이다. 그것은 실제로 존재하는 열의에 상관없이 작동하지만 모든 열이 NULL NOT 정의 된 경우에만 신뢰할 수 있도록 쿼리는 실제 NULL 값 누락 열을 구별 할 수 없습니다.

    당신이 두 테이블에 대한 지식에 따라 여러 가능한 변형이있다.

  3. ==============================

    3.나는 더 많은 다음 십 년 IBM DB2 데이터베이스 작업을 지금의 PostgreSQL를 배우려고 노력하고있다.

    나는 더 많은 다음 십 년 IBM DB2 데이터베이스 작업을 지금의 PostgreSQL를 배우려고 노력하고있다.

    그것은 PostgreSQL의 9.3.4에서 작동하지만, DB2 10.5에서 작동하지 않습니다 :

    UPDATE B SET
         COLUMN1 = A.COLUMN1,
         COLUMN2 = A.COLUMN2,
         COLUMN3 = A.COLUMN3
    FROM A
    WHERE A.ID = B.ID
    

    참고 : 큰 문제는 ANSI SQL에 있지 또한 DB2에서 지원되지 않는 원인에있다.

    그것은 DB2 10.5에서 작동하지만, PostgreSQL의 9.3.4에서 작동하지 않습니다 :

    UPDATE B SET
        (COLUMN1, COLUMN2, COLUMN3) =
                   (SELECT COLUMN1, COLUMN2, COLUMN3 FROM A WHERE ID = B.ID)
    

    드디어! 그것은 모두의 PostgreSQL 9.3.4 및 DB2 10.5에서 작동합니다 :

    UPDATE B SET
         COLUMN1 = (SELECT COLUMN1 FROM A WHERE ID = B.ID),
         COLUMN2 = (SELECT COLUMN2 FROM A WHERE ID = B.ID),
         COLUMN3 = (SELECT COLUMN3 FROM A WHERE ID = B.ID)
    
  4. ==============================

    4.이것은 큰 도움이됩니다. 코드

    이것은 큰 도움이됩니다. 코드

    UPDATE tbl_b b
    SET   (  column1,   column2,   column3)
        = (a.column1, a.column2, a.column3)
    FROM   tbl_a a
    WHERE  b.id = 1
    AND    a.id = b.id;
    

    완벽하게 작동합니다.

    당신이 브래킷 ""에서 필요하다고 지적

    From "tbl_a" a
    

    그것에게 일을 확인합니다.

  5. ==============================

    5.반드시 당신이 무엇을 요구하지만, 어쩌면 힘의 도움을 상속 포스트 그레스를 사용하고 계십니까?

    반드시 당신이 무엇을 요구하지만, 어쩌면 힘의 도움을 상속 포스트 그레스를 사용하고 계십니까?

    CREATE TABLE A (
        ID            int,
        column1       text,
        column2       text,
        column3       text
    );
    
    CREATE TABLE B (
        column4       text
    ) INHERITS (A);
    

    이 B를 업데이트 할 필요를 피할 수

    그러나 모든 세부 사항을 읽으십시오.

    그렇지 않으면, 당신이 좋은 연습으로 간주되지 않습니다 요청 - 동적 물건을 같은 낙심 * ... SELECT와 뷰로 (도움말 것보다 더 많은 문제를 일으킬 수있는 등 약간의 편의를), 그리고 당신을 위해 무엇을 요구하면에 해당하는 것 UPDATE ... SET 명령.

  6. ==============================

    6.빌드하고이 작업을 수행하는 동적 SQL을 실행하지만 정말로 이상을 수

    빌드하고이 작업을 수행하는 동적 SQL을 실행하지만 정말로 이상을 수

  7. ==============================

    7.다음 시도

    다음 시도

    Update A a, B b, SET a.column1=b.column1 where b.id=1
    

    편집 : - 업데이트 하나 이상의 열

    Update A a, B b, SET a.column1=b.column1, a.column2=b.column2 where b.id=1
    
  8. from https://stackoverflow.com/questions/2763817/sql-update-fields-of-one-table-from-fields-of-another-one by cc-by-sa and MIT license