在前一个问题的后续内容中,假设我有3个表,A,B和C.表A有一个ID,用作表B和C上的外键,每个表都有一些值作为属性。对于表A中的每个ID,我想得到表B和C之间的值差异,可以按如下方式进行:
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 :(得分: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
答案 1 :(得分: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
它有点hacky。另外,您无法创建具有联合的视图。