2012-02-02 3 views
2

부모 테이블과 상위 테이블과 구조가 조금 다른 여러 개의 하위 테이블이 있습니다. 상위 테이블과 모든 하위 테이블의 모든 데이터를 모든 추가 열로 가져 오는 쿼리를 어셈블 할 수 있습니까?Postgres : 부모 테이블과 모든 자식 테이블에서 데이터 선택

+2

테이블 구조, 예제 행 및 원하는 결과를 게시하십시오. – bos

+0

jQuery는 어디에서 시작됩니까? – Henry

답변

1

적절한 스키마 및 사용을 사용하여이 구조에 대한 PostgreSQL의에게 상속

CREATE TABLE foo(x int); 

CREATE TABLE bar(y int) INHERITS (foo); -- <=== 

INSERT INTO foo(x) VALUES(1); -- one record 
INSERT INTO bar(x,y) VALUES(2,3); -- one record 

SELECT * FROM foo; -- two results 

SELECT * FROM ONLY foo; -- one result, see ONLY 

http://www.postgresql.org/docs/current/interactive/ddl-inherit.html

+0

요청한 것이 아니라 OP (및 나)는 행이 아니라 열이 필요합니다. 나는. 'SELECT * FROM foo WHERE x = ?; '와 같은 질의는 특정 행이'bar' 테이블에 속하면'x'와'y' 열로 결과를 반환합니다. – raveren

0

간단한 대답은 쉽게 그렇게 할 수 없다. 귀찮은 행 (Informix와 달리)을 사용할 수 없으므로 간단한 선택 방식이 효과가 없습니다.

row_to_json과 많은 유니온 문을 사용하는 쿼리를 프로그래밍 방식으로 만들 수는 있지만, 그 작업은 매우 복잡하고, 원하는 것은 아닐 수도 있습니다. 열이 같은 이름이지만 다른 하위 테이블에서 다른 의미를 가질 수있는 경우를 처리하지 못합니다.

일반적으로 여기에 접근 방식을 재고해야한다고 생각합니다. 들쭉날쭉 한 행에 의존하려는 경우 응용 프로그램과 데이터베이스간에 매우 느슨한 계약을 많이 맺을 것이므로 고유 한 문제에 대한 많은 잠재력을 갖게 될 것입니다.

여기서 가장 좋은 방법은 추가 열을 left join을 사용하여 검색 할 수있는 조인 테이블로 이동하는 것입니다.

1

여기에 필요한 것은 왼쪽 외부 조인을 사용하는 것입니다. 또 다시, 아니 이상적인 솔루션 및 데이터베이스 구조의 잠재적 변화가 더 나은 것,하지만 여전히, 여기있다 : 것

CREATE TABLE foo(x int); 

CREATE TABLE bar(y int) INHERITS (foo); 

INSERT INTO foo(x) VALUES(1); 
INSERT INTO bar(x,y) VALUES(2,3); 

SELECT foo.*, bar.y 
FROM foo LEFT OUTER JOIN bar ON (foo.x = bar.x); 

단지 부모의 항목은 Y에 대한 널 (null)이이 촬영 될 그러나 모든 데이터를 제거합니다. 단점은 하위 테이블에서 특별히 추가 열의 이름을 지정해야한다는 것입니다. (비록 어쨌든 코드로 들어가는 쿼리에서 *를 사용하지 않는 것이 가장 좋습니다.)

실제로 하위 테이블에 열의 이름을 지정하지 않으려는 경우를 제외하고 모든 것을 선택하는 방법에 대한 기사가 있습니다 특정 열 here. 두 사람을 함께 모으는 방법을 알아낼 수 있습니다.

편집 : 경우 Y에서

은 null로 설정 될 수 있으며 합법적 인 바 Y 널 (null)과 비 ligitimate foo는 y를 널 (null)이 무엇인지를 구분하는 것이 중요합니다, 당신은 대신을 시도 할 수 있습니다 :

SELECT 'foo' AS from_table, *, NULL::int AS y 
FROM ONLY foo 

UNION 

SELECT 'bar' AS from_table, * 
FROM bar; 

그런 다음 코드 끝에서 from 테이블 열을 사용하여 어디에서 왔는지 처리하고 어떤 null 값이 합법적인지 아닌지를 알 수 있습니다.

관련 문제