[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.당신은 설정 복귀 기능을 사용할 수 있습니다 :
당신은 설정 복귀 기능을 사용할 수 있습니다 :
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.이미 정리 @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.대부분의 경우 집합을 돌려주는 기능이 길을 가야하는 것입니다,하지만 당신은 세트에 모두 읽기 및 쓰기를 원하는 경우에, 뷰가 더 적합 할 수있다. 뷰가 세션 매개 변수를 읽을 그리고 그것은 가능하다 :
대부분의 경우 집합을 돌려주는 기능이 길을 가야하는 것입니다,하지만 당신은 세트에 모두 읽기 및 쓰기를 원하는 경우에, 뷰가 더 적합 할 수있다. 뷰가 세션 매개 변수를 읽을 그리고 그것은 가능하다 :
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.난 당신이 언급 한 같은 "동적"보기가 가능하다고 생각하지 않습니다.
난 당신이 언급 한 같은 "동적"보기가 가능하다고 생각하지 않습니다.
왜 2 개 인자를 대신합니다 저장 프로 시저를 작성하지?
-
==============================
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 연산자를 사용하는 것보다해야한다; 심지어 매개 변수 테이블에서 최종 데이터를 가져 오는 제외한 데이터 테이블을 건드리지 않고 오직 인덱스 값을 사용합니다 여기 매개 변수가 존재한다.
from https://stackoverflow.com/questions/11401749/pass-in-where-parameters-to-postgresql-view by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL의 쿼리에 일련 번호를 생성 (0) | 2020.06.23 |
---|---|
[SQL] 구분 위치에 의해 분할 문자열 오라클 SQL을 사용하여 (0) | 2020.06.23 |
[SQL] 복합 기본 키 : 그것이 좋은지 나쁜지 (0) | 2020.06.23 |
[SQL] Windows 인증을 사용하여 SQL 서버에 연결 (0) | 2020.06.23 |
[SQL] SQL 서버 테이블 작성 날짜 쿼리 (0) | 2020.06.23 |