복붙노트

[SQL] 패스에서 PostgreSQL을보기로 ""매개 변수?

SQL

패스에서 PostgreSQL을보기로 ""매개 변수?

나는 중첩 된 서브 쿼리의 시리즈를 통해 4 테이블에 걸쳐 내 PostgreSQL 데이터베이스에 다소 복잡한 쿼리가 있습니다. 두 개의 외부 변수의 매칭에 따라 (즉, 상황에 도움이된다면, 같은 테이블에서) 그러나, 약간 까다로운 찾고 외관 및 설정에도 불구하고, 궁극적으로는 (두 문자열이 다른 테이블의 필드와 일치 할 필요는) 두 개의 열을 반환합니다. 내가보기라는이 보이는 마법의 일이 존재한다는 것을 알 수 있도록 나는, PostgreSQL의에서 데이터베이스 디자인에 비교적 새로운 해요, 그게 날 여기 도움이 될 것 같아, 그러나 아마 없다.

내가보기 안에 내 복잡한 쿼리를 이동하고 어떻게 든 단지 그것을 내가 일치 할 필요는 두 개의 값을 전달할 수있는 방법이 있습니까? 즉 크게 (데이터베이스 구조에 복잡성을 이동하여) 프런트 엔드에 내 코드를 단순화한다. 내 정적 예를 들어 쿼리를 래핑하는 뷰를 생성 할 수 있습니다 작동하는지 잘 만 문자열 값 한 쌍의 작동하지만 것이다. 나는 다른 값의 다양한 사용할 수 있어야합니다.

그래서 제 질문은 : 그것은 다른 정적보기에 매개 변수를 전달하고 "동적"가있을 수 있습니까? 아니면 뷰가 접근하는 올바른 방법은 아니다. 더 잘 작동 할 다른 뭔가가 있다면, 나는 모든 귀 해요!

* 편집 : 바와 같이 의견 요청 * 지금의 약자로, 여기 내 쿼리입니다 :

SELECT   param_label, param_graphics_label
  FROM   parameters
 WHERE   param_id IN 
         (SELECT param_id 
            FROM parameter_links
           WHERE region_id = 
                 (SELECT region_id
                    FROM regions
                   WHERE region_label = '%PARAMETER 1%' AND model_id =
                         (SELECT model_id FROM models WHERE model_label = '%PARAMETER 2%')
                 )
         ) AND active = 'TRUE'
ORDER BY param_graphics_label;

매개 변수는 위의 백분율 기호에 의해 출발한다.

해결법

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

    1.당신은 설정 복귀 기능을 사용할 수 있습니다 :

    당신은 설정 복귀 기능을 사용할 수 있습니다 :

    create or replace function label_params(parm1 text, parm2 text)
      returns table (param_label text, param_graphics_label text)
    as
    $body$
      select ...
      WHERE region_label = $1 
         AND model_id = (SELECT model_id FROM models WHERE model_label = $2)
      ....
    $body$
    language sql;
    

    그럼 당신은 할 수 있습니다 :

    select *
    from label_params('foo', 'bar')
    

    BTW : 당신은 당신이 원하는 있습니다 :

    AND model_id = (SELECT model_id FROM models WHERE model_label = $2)
    

    model_label 고유 (또는 기본 키)가 아닌 경우 다음이 결국 오류가 발생합니다. 당신은 아마 원하는 :

    AND model_id IN (SELECT model_id FROM models WHERE model_label = $2)
    
  2. ==============================

    2.이미 정리 @a_horse 것 외에도, 대신 중첩 된 서브 쿼리의 JOIN 구문을 사용하여 SQL을 단순화 할 수있다. 성능은 유사하지만 구문은 훨씬 짧고 쉽게 관리 할 수 ​​있습니다.

    이미 정리 @a_horse 것 외에도, 대신 중첩 된 서브 쿼리의 JOIN 구문을 사용하여 SQL을 단순화 할 수있다. 성능은 유사하지만 구문은 훨씬 짧고 쉽게 관리 할 수 ​​있습니다.

    CREATE OR REPLACE FUNCTION param_labels(_region_label text, _model_label text)
      RETURNS TABLE (param_label text, param_graphics_label text) AS
    $func$
        SELECT p.param_label, p.param_graphics_label
        FROM   parameters      p 
        JOIN   parameter_links l USING (param_id)
        JOIN   regions         r USING (region_id)
        JOIN   models          m USING (model_id)
        WHERE  p.active
        AND    r.region_label = $1 
        AND    m.model_label = $2
        ORDER  BY p.param_graphics_label;
    $func$ LANGUAGE sql;
    
  3. ==============================

    3.대부분의 경우 집합을 돌려주는 기능이 길을 가야하는 것입니다,하지만 당신은 세트에 모두 읽기 및 쓰기를 원하는 경우에, 뷰가 더 적합 할 수있다. 뷰가 세션 매개 변수를 읽을 그리고 그것은 가능하다 :

    대부분의 경우 집합을 돌려주는 기능이 길을 가야하는 것입니다,하지만 당신은 세트에 모두 읽기 및 쓰기를 원하는 경우에, 뷰가 더 적합 할 수있다. 뷰가 세션 매개 변수를 읽을 그리고 그것은 가능하다 :

    CREATE VIEW widget_sb AS SELECT * FROM widget WHERE column = cast(current_setting('mydomain.myparam') as int)
    
    SET mydomain.myparam = 0
    select * from widget_sb
    [results]
    
    SET mydomain.myparam = 1
    select * from widget_sb
    [distinct results]
    
  4. ==============================

    4.난 당신이 언급 한 같은 "동적"보기가 가능하다고 생각하지 않습니다.

    난 당신이 언급 한 같은 "동적"보기가 가능하다고 생각하지 않습니다.

    왜 2 개 인자를 대신합니다 저장 프로 시저를 작성하지?

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

    5.나는 다음과 같이 쿼리를 바꿔 것입니다 :

    나는 다음과 같이 쿼리를 바꿔 것입니다 :

    SELECT   p.param_label, p.param_graphics_label
      FROM   parameters p
    where exists (
        select 1
        from parameter_links pl
        where pl.parameter_id = p.id
        and exists (select 1 from regions r where r.region_id = pl.region_id
    ) and p.active = 'TRUE'
    order by p.param_graphics_label;
    

    당신이 여러 ID 컬럼에 인덱스가 있다고 가정하면,이 쿼리는 훨씬 빠르게 IN 연산자를 사용하는 것보다해야한다; 심지어 매개 변수 테이블에서 최종 데이터를 가져 오는 제외한 데이터 테이블을 건드리지 않고 오직 인덱스 값을 사용합니다 여기 매개 변수가 존재한다.

  6. from https://stackoverflow.com/questions/11401749/pass-in-where-parameters-to-postgresql-view by cc-by-sa and MIT license