2009-07-12 2 views
1

이전 질문에 대한 후속 작업에서 3 개의 테이블 A, B 및 C가 있다고 가정 해 보겠습니다. 테이블 A에는 테이블 B의 외래 키로 사용되는 ID가 있습니다 와 C (각각은 속성으로서 어떤 값을 가짐). 다음과 같이 테이블 A의 각 ID를 들어, 내가 할 수있는 테이블 B와 C 사이의 값의 차이를 가져올 지 :다중 계산 된 값을 기반으로 한 MySQL의 뷰

CREATE VIEW T1 AS 
    SELECT B.A_ID AS ID, SUM(B.VALUE) AS VAL 
    FROM B 
    GROUP BY B.A_ID; 
CREATE VIEW T2 AS 
    SELECT C.A_ID AS ID, SUM(C.VALUE) AS VAL 
    FROM C 
    GROUP BY C.A_ID; 
SELECT T1.ID, T1.VAL, T2.VAL FROM T1, T2 WHERE T1.ID = T2.ID; 

문제는 테이블 B가 특정 ID에 대한 몇 가지 값이 어떤 경우입니다 , 그러나 테이블 C는 그렇지 않습니다. 이 경우 select 문은 해당 행을 반환하지 않습니다.

CREATE VIEW T3 AS 
    SELECT B.A_ID AS ID, SUM(B.VALUE) AS VAL1, SUB(C.VAL) AS VAL2 
    FROM B, C 
    WHERE B.A_ID = C.A_ID 
    GROUP BY B.A_ID; 

이러한 뷰의 작성 스크립트의 예는 평가 될 것입니다 : 내가 기본적으로 다음과 같이 보이는, 단일 뷰를 만들 수있는 방법이있다.

+0

나는 정말로 당신을 위해 일하는 솔루션에 관심이 있습니다. –

+0

나는 적어도 당신이 제안한 것을 사용하려고 할 것입니다. 해결할 데이터베이스에 대한 내 사용자 액세스 권한으로 호스팅 제공 업체에 문제가 있습니다. 따라서 스크립트를 준비했지만 아직 테스트 할 수 없었습니다. 솔루션이 정상적으로 작동하면 답변을 올바르게 수락합니다. – Elie

+0

내 호스팅 제공 업체는 MySQL 5.0 만 지원하며, 뷰는 MySQL 5.0.1에서 도입되었으므로 데이터를 자동으로 대조하는 옵션이 꺼져 있습니다. – Elie

답변

1

는이

CREATE VIEW myView AS 
SELECT test_a.id, name, IFNULL((
    SELECT SUM(value) 
    FROM test_b 
    WHERE test_b.a_id = test_a.id 
    GROUP BY test_b.a_id) , 0 
) - IFNULL((
    SELECT SUM(value) 
    FROM test_c 
    WHERE test_c.a_id = test_a.id 
    GROUP BY test_c.a_id) , 0 
) 
FROM test_a 

사용할 수 있지만 C가 B보다 더 높은 금액이있는 경우이 음수가 발생합니다. 당신이 사용하는 것보다 절대 차이를 원하는 경우 :

CREATE VIEW myView AS 
SELECT test_a.id, name, ABS(IFNULL((
    SELECT SUM(value) 
    FROM test_b 
    WHERE test_b.a_id = test_a.id 
    GROUP BY test_b.a_id) , 0) - IFNULL((
SELECT SUM(value) 
    FROM test_c 
    WHERE test_c.a_id = test_a.id 
    GROUP BY test_c.a_id) , 0 
) 
) 
FROM test_a 
+0

두 테이블 B와 C 모두 A에서 수백 개의 행에 대해 수천 개의 행을 가질 수 있으므로이 쿼리의 성능은 어떻습니까? (차이점이 양수인지 음수인지를 알 필요가 있으므로 첫 번째 옵션을 사용합니다.) 또한보기로 이것을 수행 할 수있는 방법이 있습니까? – Elie

+0

보기를 만들려면 그냥 보기 앞에보기 이름으로보기 ... 까지 성능이 좋지 않다면 ... 시도해야 할 것입니다. 각각 몇 줄의 테이블. 테이블 a에 b 또는 c가없는 ID가있는 경우 고려해야 할 또 다른 문제는 ... 내 쿼리는 0을 반환합니다. 원하지 않는 경우 주위에 방법이 있습니다. –

0
SELECT ID, MAX(VAL1), MAX(VAL2) FROM 
((SELECT B.A_ID AS ID, SUM(B.VALUE) AS VAL1, 0 as VAL2 
FROM B GROUP BY B.A_ID) as T1 
UNION 
(SELECT C.A_ID AS ID, 0 VAL1, SUM(C.VALUE) AS VAL2 
FROM C GROUP BY C.A_ID) as T2) as Foo 
GROUP BY FOO.ID 

그 조금 해키. 또한 유니언이있는 뷰를 만들 수 없습니다.

관련 문제