복붙노트

[SQL] 포스트 그레스를 사용하여 여러 스키마에서 모든 레코드를 선택합니다 (검색)

SQL

포스트 그레스를 사용하여 여러 스키마에서 모든 레코드를 선택합니다 (검색)

나는 다음과 같은 몇 가지 스키마와 PostgreSQL 데이터베이스를 가지고 :

My_Database
 |-> Schemas
    |-> AccountA
    |-> AccountB
    |-> AccountC
    |-> AccountD
    |-> AccountE
           .
           .
           .
    |-> AccountZ

모든 스키마는 제목이라는 열이있는 테이블라는 제품이있다. 특정 조건으로 모든 스키마의 모든 레코드를 검색하는 SELECT 문을 실행할 수 있는지 알고 싶습니다.

지금까지 발견 된 유일한 방법은 아래와 같은 계정으로 쿼리 계정을 실행하는 것입니다.

SET search_path TO AccountA;

SELECT title FROM product WHERE title ILIKE '%test%';

내가 그들의 이름을 모르거나 얼마나 많은 이들의 존재 때문에 스키마는 동적으로 생성됩니다.

해결법

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

    1.언급 @Denis 같은 상속, 이것은 매우 간단하다. 또한, 포스트 그레스 8.4에 대한 작동합니다. 한계를 생각해야합니다.

    언급 @Denis 같은 상속, 이것은 매우 간단하다. 또한, 포스트 그레스 8.4에 대한 작동합니다. 한계를 생각해야합니다.

    기본적으로, 당신은 마스터 테이블이 것, 나는 마스터 스키마에 가정 :

    CREATE TABLE master.product (title text);
    

    그리고 그것에서 다양한 도식을 상속에있는 다른 모든 테이블은, 아마도 더 많은 지역의 열을 추가 :

    CREATE TABLE a.product (product_id serial PRIMARY KEY, col2 text)
    INHERITS (master.product);
    
    CREATE TABLE b.product (product_id serial PRIMARY KEY, col2 text, col3 text)
    INHERITS (master.product);
    

    기타

    테이블은 같은 이름 또는 스키마를 공유 할 필요가 없습니다. 그럼 당신은 하나의 급습 모든 테이블을 조회 할 수 있습니다 :

    SELECT title, tableoid::regclass::text AS source
    FROM   master.product
    WHERE  title ILIKE '%test%';
    

    tableoid :: regclass 형 : 텍스트? 즉, 각 행의 소스를 말할 수있는 편리한 방법입니다. 세부:

    SQL 바이올린.

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

    2.당신은 기본적으로 노동 조합을 모두 원하는 :

    당신은 기본적으로 노동 조합을 모두 원하는 :

    SELECT title FROM AccountA.product WHERE title ILIKE '%test%'
    UNION ALL
    SELECT title FROM AccountB.product WHERE title ILIKE '%test%'
    UNION ALL
    ...;
    

    당신은 제품 테이블이있는 모든 AccountXYZ 스키마의 위치를 ​​동적 SQL 및 카탈로그를 사용하여 그렇게 자동으로 할 수 있습니다.

    또한, 유사한 개별 스키마에있는 것과 같은 테이블 및 사용 테이블 상속과 AllAccounts 스키마를 만들 수 있습니다.

    어느 쪽도하지만, 데이터에서 어떤 스키마를 알려 않습니다. 전자의 경우, 이것은 쉽게 추가 할 수 충분히이다; 그다지 후자에 당신은 여분의 열을 추가하지 않는 한.

  3. from https://stackoverflow.com/questions/20575610/select-retrieve-all-records-from-multiple-schemas-using-postgres by cc-by-sa and MIT license