성능상의 이유로 논리적으로 하나의 테이블을 조각으로 나눈 테이블 세트가 있습니다. 모든 테이블을 효율적으로 조인하는 쿼리를 작성해야하므로 결과의 단일 where 절을 사용합니다. 내가 성공적으로의 WHERE 절을 사용하여 결과에 UNION을 사용하고 각 서브 테이블에 명시 적으로 다음과 같은UNION 쿼리를 하위 쿼리로 처리하는 방법
SELECT * FROM FRED_1 WHERE CHARLIE = 42
UNION
SELECT * FROM FRED_2 WHERE CHARLIE = 42
UNION
SELECT * FROM FRED_3 WHERE CHARLIE = 42
하지만 때마다 고통 WHERE 절을 업데이트 십 개 별도의 서브 테이블이 있기 때문에. 내가 원하는 것은 이런 것입니다.
SELECT *
FROM (
SELECT * FROM FRED_1
UNION
SELECT * FROM FRED_2
UNION
SELECT * FROM FRED_3)
WHERE CHARLIE = 42
차이가 나는 경우 DB2 데이터베이스에 대해 쿼리를 실행해야합니다.
여기에 내가해야 할 일에 대한보다 포괄적 인 (살균 된) 버전이 있습니다.
select *
from (select * from FRD_1 union select * from FRD_2 union select * from FRD_3) as FRD,
(select * from REQ_1 union select * from REQ_2 union select * from REQ_3) as REQ,
(select * from RES_1 union select * from RES_2 union select * from RES_3) as RES
where FRD.KEY1 = 123456
and FRD.KEY1 = REQ.KEY1
and FRD.KEY1 = RES.KEY1
and REQ.KEY2 = RES.KEY2
NEW 정보 :
문제가 무엇보다도 노동 조합의 필드의 수 기능과 더 많은 관계를 가지고있다처럼 보인다. 필드를 크게 제한하면 작동하는 구문 변형의 대부분을 얻을 수 있습니다. 불행하게도 필드를 너무 많이 제한하면 결과 쿼리가 유용 할 수 있지만 원하는 결과를 얻지 못합니다. 나는 2 개의 키 이외에 테이블 중 하나에서 추가로 3 개의 필드를 얻을 수 있었다. 그 이상이면 쿼리가 실패합니다.
는 구문 오류가 발생합니까? UNION이 아닌 UNION ALL을 사용하면 제대로 작동합니다. 그런 다음 노조를 뷰에 넣고 파티셔닝을 다시 시작했습니다. – araqnid
이 "분할 테이블"전략은 식별 된 비관적 기술입니다. – dkretz
나는 실제로 비관론이 의미하는 바를 찾아야 만했다 :-) 그런데, 테이블 아이디어를 나누는 것은 약 10 살 정도의 응용 프로그램의 일부이기 때문에 그것에 대해 많이 할 수는 없다. –