2009-07-12 142 views
1

在上一個問題的後續內容中,假設我有3個表A,B和C.表A有一個ID,用作表B上的外鍵和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

我對最終爲您工作的解決方案非常感興趣。 – 2009-07-13 17:08:17

+0

我可能會嘗試,至少使用你提出的那個。我與我的託管服務提供商存在問題,用戶可以訪問正在解析的數據庫,所以我還沒有能夠對其進行測試,儘管我已準備好了我的腳本。如果你的解決方案有效,我會接受你的答案是正確的。 – Elie 2009-07-13 20:00:30

回答

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
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 

它有點哈克。另外,您不能創建具有聯合的視圖。