복붙노트

[SQL] SQLite는 내부 조인 - 업데이트가 다른 테이블의 값을 사용하여

SQL

SQLite는 내부 조인 - 업데이트가 다른 테이블의 값을 사용하여

이것은 아주 쉽고 여러 번 요청하고있다 그러나 나는 일에 그것을 얻을 수 없습니다. 내가 일을해야한다고 생각 SQL 쿼리는 다음과 같습니다

    UPDATE table2
       SET dst.a = dst.a + src.a,
           dst.b = dst.b + src.b,
           dst.c = dst.c + src.c,
           dst.d = dst.d + src.d,
           dst.e = dst.e + src.e
      FROM table2 AS dst 
INNER JOIN table1 AS src
        ON dst.f = src.f

해결법

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

    1.SQLite는이 업데이트 문에 조인에서 지원되지 않기 때문에 UPDATE 문을 사용하는 것은 불가능합니다. 문서를 참조하십시오 : 업데이트 문

    SQLite는이 업데이트 문에 조인에서 지원되지 않기 때문에 UPDATE 문을 사용하는 것은 불가능합니다. 문서를 참조하십시오 : 업데이트 문

    당신은 단지 정적 값으로 단일 열을 업데이트하고 싶다면, 당신은 제대로 업데이트 문에 하위 쿼리를 사용할 수 있습니다. SQLite는에 테이블을 조인하는 동안 업데이트를 어떻게해야합니까 :이 예제를 참조하십시오?

    이제 예에서, 가정을 만드는 것은 "열 F"에 고유 키가 있다는 것을 - 나는 문을 대체 사용 마련이 해결 방법 / 솔루션 :

    replace into table2
    (a, b, c, d, e, f, g)
    select src.a, src.b, src.c, src.d, src.e, dest.f, dest.g
    from table1 src
    inner join table2 dest on src.f = dest.f
    

    나는 또한 당신이 "갱신"오직이 방법 일부 열 거라고하는 방법을 보여주는 표 2 "열 g"에 여분의 열을 추가했다.

    또 다른 것은 당신이 사용하는 경우 약은 신중해야 "PRAGMA의 foreign_keys = ON을;" 이 행이 효과적으로 삭제 및 삽입으로이 문제를 가질 수 있습니다.

  2. ==============================

    2.나는 대안 기술 트리거를 사용하여 소스 테이블의 더미 필드의 비용이기는하지만, 업데이트의 방향을 "반전"를 내놓았다.

    나는 대안 기술 트리거를 사용하여 소스 테이블의 더미 필드의 비용이기는하지만, 업데이트의 방향을 "반전"를 내놓았다.

    일반적인 관점에서, 당신은 마스터 테이블과 업데이트 테이블이있다. 당신은 일부를 업데이트 할 / 업데이트에서 해당 분야의 마스터 레코드의 모든 필드는 키 필드의 키에 의해 연결.

    대신 UPDATE 마스터 SET의 ... 마스터 INNER로부터 가입 업데이트를 Master.Key = Updates.Key 다음을 수행 :

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

    3.토니가 말한대로,이 솔루션은이 방법으로 대체하지만 당신은 sqlite가 숨겨진 필드처럼 가입으로 전체 업데이트를 시뮬레이션 할 rowid로 사용할 수 있습니다 :

    토니가 말한대로,이 솔루션은이 방법으로 대체하지만 당신은 sqlite가 숨겨진 필드처럼 가입으로 전체 업데이트를 시뮬레이션 할 rowid로 사용할 수 있습니다 :

    replace into table2
    (rowid,a, b, c, d, e, f, g)
    select dest.rowid,src.a, src.b, src.c, src.d, src.e, dest.f, dest.g
    from table1 src
    inner join table2 dest on src.f = dest.f
    

    당신이 조인으로 업데이트를 할 수있는 대체 또는 표준 방법으로 기본 키가없는 경우이하면 전체 행을 다시 작성하십시오.

  4. ==============================

    4.내부 조인도 여러 가지 다른 DB의 수행과 SQLite는 업데이트를 지원하지 않습니다. 내부는 그것이 단지 UPDATE 및 하위 쿼리 선택을 사용하여 수행 할 수 있지만 좋은 간단 결합합니다. 'SET'에 대해 동일한 결과를 where 절 및 하위 쿼리와 'IN'과 추가 하위 쿼리를 사용하여 항상 수행 할 수 있습니다. 다음은 어떻게하는지입니다.

    내부 조인도 여러 가지 다른 DB의 수행과 SQLite는 업데이트를 지원하지 않습니다. 내부는 그것이 단지 UPDATE 및 하위 쿼리 선택을 사용하여 수행 할 수 있지만 좋은 간단 결합합니다. 'SET'에 대해 동일한 결과를 where 절 및 하위 쿼리와 'IN'과 추가 하위 쿼리를 사용하여 항상 수행 할 수 있습니다. 다음은 어떻게하는지입니다.

    UPDATE table2
      SET a = a + (select a from table1 where table1.f = table2.f),
           b = b + (select b from table1 where table1.f = table2.f),
           c = c + (select c from table1 where table1.f = table2.f),
           d = d + (select d from table1 where table1.f = table2.f),
           e = e + (select e from table1 where table1.f = table2.f)
      WHERE RowId IN (Select table2.RowId from table1 where table1.f = table2.f) 
    
  5. ==============================

    5.쿼리 아래 사용

    쿼리 아래 사용

    UPDATE table2
    SET a = Z.a,
        b = Z.b,
        c = Z.c,
        d = Z.d,
        e = Z.e
    FROM (SELECT dst.id, 
                 dst.a + src.a AS a,
                 dst.b + src.b AS b,
                 dst.c + src.c AS c,
                 dst.d + src.d AS d,
                 dst.e + src.e AS e
          FROM table2 AS dst 
          INNER JOIN table1 AS src ON dst.f = src.f
          )Z
    WHERE table2.id = z.id
    
  6. from https://stackoverflow.com/questions/11790595/sqlite-inner-join-update-using-values-from-another-table by cc-by-sa and MIT license