我有3个像这样的表(剥离版本):
Create table A (
AID Int NOT NULL,
PRIMARY KEY (AID)
)
Create table B (
BID Int NOT NULL,
AID Int NOT NULL,
PRIMARY KEY (BID),
FOREIGN KEY (AID) REFERENCES A(AID)
)
Create table C (
CID Int NOT NULL,
BID Int NOT NULL,
Price Decimal(12,4) NOT NULL,
PRIMARY KEY (CID),
FOREIGN KEY (BID) REFERENCES B(BID)
)
A中的每个记录在B中只能有一个最新记录(最后一个ID被认为是最新的),例如:我们在A中有一条记录,其中B中有3个相关记录,但只有最后一条记录是被认为是最新的,只应使用那个。
每次更新B中的记录(在这种情况下插入)时,C中的所有记录都会重复并指向B中新创建的记录。
如何获得所有A记录的C.Price的总和。
到目前为止,我得到了:(但不同似乎没有用)
SELECT SUM(Price)
FROM C
INNER JOIN (
SELECT DISTINCT t2.AID, t2.BID
FROM (
SELECT BID, AID
FROM B
INNER JOIN (
SELECT AID
FROM A
-- some other statements go here
) t1
ON t1.AID = AID
ORDER BY BID DESC
) t2
) t3
ON t3.BID = C.BID
我希望我解释得很好。 :/
答案 0 :(得分:2)
每次更新B中的记录(在这种情况下插入),全部 C中的记录是重复的,并指向新创建的记录 乙
这意味着只有C中的记录具有最新的CONSOLE
值。这意味着,您不需要BID
它们,您只需要获取最新记录。
只是用样本数据来说明:
表A:
SUM
表B:
AID
1
2
3
表C:
BID AID
1 1
2 1
3 1
4 2
5 2
6 2
7 3
8 3
9 3
您可以使用:
CID BID Price
1 1 12
2 2 12
3 3 20
4 4 2
5 5 1
6 6 12
7 7 22
8 8 21
9 9 23
观察到此处没有总和。
这会给你结果:
SELECT ab.AID,
c.Price
FROM (SELECT a.aid, MAX(b.BID) AS maxB
FROM a a
INNER JOIN b b ON a.AID = b.AID
GROUP BY a.AID
) ab
INNER JOIN C c ON ab.maxB = c.BID
你可以在这里看到 - > http://sqlfiddle.com/#!9/4943cd/3
戈登的回答也会给你相同的结果 - > http://sqlfiddle.com/#!9/4943cd/2
您可以看到,无论是否使用AID PRICE
1 20
2 12
3 23
,结果都是相同的。
注意:但是,Gordon的答案(这里是明确的答案)是不正确的,因为它没有考虑如果从表A中删除任何值,那么结果集将具有冗余值强>
如果您稍微更改原始数据集,可以观察到这一点:
表A:
SUM
表B:
AID
1
表C:
BID AID
1 1
2 1
3 1
4 2
5 2
6 2
7 3
8 3
9 3
戈登的询问会产生结果:
CID BID Price
1 1 12
2 2 12
3 3 20
4 4 2
5 5 1
6 6 12
7 7 22
8 8 21
9 9 23
这是不正确的,因为没有AID值2和3。
您需要在表A上加入以获取表A中
希望这有帮助!!!
答案 1 :(得分:1)
以下应该做你想做的事:
select b.aid, sum(c.price)
from b join
c
on c.bid = b.bid
where b.bid = (select max(b2.bid) from b b2 where b2.aid = b.aid)
group by b.aid;
join
将表格合并在一起。请注意,a
不是必需的 - 除非您希望来自a
的行b
中没有相应的行(在这种情况下,a
将首先带left join
1}})。
where
子句为每个b
选择最新的aid
条记录。 group by
用于获得总和。