2014-02-07 6 views
4

두 개의 열 foreign_table_nameforeign_key을 포함하는 테이블 이름이 table입니다.postgres에서 동적 식별자가있는 테이블을 조인하는 방법은 무엇입니까?

이 테이블의 값 JOINforeign_table_name에 지정된 이름의 테이블 인 SELECT 쿼리를 작성할 수 있습니까?

SELECT table.foo, table.bar, foreign_table.name 
FROM table 
    JOIN $foreign_table AS foreign_table 
     ON (foreign_table.id = table.foreign_key 
      $foreign_table = table.foreign_table); 

PlpgSQL을 사용하는 모든 솔루션을 허용 물론이다 : 우리는 모든 가능한 타겟팅 된 외국 테이블이 name 필드가 있음을 알고 있다면 내가 무언가를 쓸 수 있다면

는 예를 들어, 내가 알고 싶습니다.

Table ``table`` 
------------------------------------------------ 
| foo | bar | foreign_table_name | foreign_key | 
------------------------------------------------ 
| A | 1 | fruits    | 8   | 
| B | 2 | vegetable   | 5   | 
------------------------------------------------ 

Table ``fruit`` 
--------------- 
| id | name | 
--------------- 
| 8 | apple | 
--------------- 

Table ``vegetable`` 
---------------- 
| id | name | 
---------------- 
| 5 | carrot | 
---------------- 

예상되는 결과 테이블은 다음과 같습니다 :

---------------------- 
| foo | bar | name | 
---------------------- 
| A | 1 | apple | 
| B | 2 | carrot | 
---------------------- 

편집 :

는 여기에 간단한 내용의 나는 명확하게하기위한 시도로 전체 테이블의 예를 추가했습니다.

+0

이렇게하려면 동적 SQL/준비된 명령문을 사용해야합니다. 기본 SQL 쿼리에서는 명시 적 테이블이 있어야합니다. –

+0

PL/PgSQL에서'EXECUTE' 명령을보십시오. 또는 클라이언트에서 쿼리를 생성하십시오. –

+0

@CraigRinger 이미''EXECUTE'' 문을 보았습니다. 그러나 이것으로도 해결책을 찾을 수 없었습니다. 그러니 마음에 든다면 공유하십시오. – vaab

답변

6

클라이언트 측에서 이런 종류의 작업을 수행하는 것이 일반적으로 더 쉽지만 원하는 경우 PL/PgSQL을 사용하여 가능합니다.

CREATE OR REPLACE FUNCTION dynamic_call(tblname text) 
RETURNS TABLE (foo int, bar text, fname text) 
AS $$ 
BEGIN 
    RETURN QUERY EXECUTE format(' 
    SELECT t.foo, table.bar, f."name" 
    FROM mytable t 
    JOIN %I AS f ON (f.id = t.foreign_key);', tblname); 
END; 
$$ LANGUAGE plpgsql; 

자세한 내용은 PL/PgSQL 설명서를 참조하십시오.

+0

나는 내 질문에 대해 충분히 분명히 밝히지 않았다. 그래서 나는 실제적인 예를 덧붙이도록 편집했다. 당신의 대답은 나를 도울 수 없기 때문에 : 1 - 그것은 함수이고, 나는 테이블을 요청했고, 테이블 이름은 기본 테이블 컬럼''foreign_table_name''에서왔다. 그러나 제안을 읽는 동안 plpgsql을 배웠습니다. 특히 놓친 "RETURNS TABLE"을 읽었습니다. 이것으로 아마도 해결책을 찾을 수있을 것입니다. 고마워. – vaab

+0

@vaab 동적 SQL 없이는이 작업을 수행 할 수 없으므로 PL/PgSQL 함수 또는 클라이언트 측 생성 SQL을 사용해야합니다. –

관련 문제