>source

TableA와 TableB를 조인하는 간단한 시나리오 TableA, TableB 및 JoinTable이 있습니다. TableA의 각 행에 대해 TableAId가있는 JoinTable의 레코드 수를 TableA에 저장하고 싶습니다. 다음과 같이 올바르게 선택할 수 있습니다.

SELECT "Id", (SELECT COUNT(*) FROM "JoinTable" WHERE "JoinTable"."TableAId" = "TableA"."Id") 
AS TOT FROM "TableA" LIMIT 100

그러나 업데이트 쿼리를 작성하는 데 어려움을 겪고 있습니다. 이 결과로 TableA.JoinCount를 업데이트하고 싶습니다.

  • 답변 # 1

    상관 된 하위 쿼리를 사용할 수 있습니다.

    update tablea a
    set tot = (
        select count(*)
        from jointable j
        where t.tableaid = a.id
    )
    
    

    이것은 모든 행을 업데이트합니다. tablea 일치하는 수 jointable ;일치하지 않으면 tot 로 설정됩니다 0 .

    그러나 반드시 그러한 파생 정보를 저장하는 것이 좋습니다. 위의 문장으로 쉽게 초기화 할 수 있지만 유지 관리는 지루합니다. 조인 테이블의 모든 DML 작업 (업데이트, 삭제, 삽입)에 대한 트리거를 곧 생성하게 될 것입니다. 대신 정보를보기에 넣을 수 있습니다.

    create view viewa as
    select id, 
        (select count(*) from jointable j where j.tableaid = a.id) as tot
    from tablea a
    
    

    참고 : 일반적으로 Postgres에서 인용 식별자를 사용하지 마십시오. 자세한 내용은이 링크입니다.

  • 답변 # 2

    쿼리 별 그룹을 UPDATE 문의 소스로 사용할 수 있습니다.

    update "TableA" a
      set "JoinCount" = t.cnt
    from (
      select "TableAId" as id, count(*) as cnt
      from "JoinTable" 
      group by "TableAId"
    ) t  
    WHERE t.id = a."Id"
    
    

관련 자료

  • 이전 sql - 회사의 마지막 날과 같은 지점에서 값을 계산합니다
  • 다음 CLI를 통해 Vault (Hashicorp) 엔티티를 기존 그룹에 추가하는 방법