2012-07-14 26 views
0

MasterTable的量的总和我有两个表:
1.主获取它连接到DetailTable

 
| ID | Name | Amount | 
|-----|--------|--------| 
| 1 | a | 5000 | 
| 2 | b | 10000 | 
| 3 | c | 5000 | 
| 4 | d | 8000 | 

2.详细

 
| ID |MasterID| PID | Qty | 
|-----|--------|-------|------| 
| 1 | 1 | 1 | 10 | 
| 2 | 1 | 2 | 20 | 
| 3 | 2 | 2 | 60 | 
| 4 | 2 | 3 | 10 | 
| 5 | 3 | 4 | 100 | 
| 6 | 4 | 1 | 20 | 
| 7 | 4 | 3 | 40 | 

我想从选择sum(Amount)主人其中加入Deatil其中Detail.PID in (1,2,3)

所以我执行以下查询:

SELECT SUM(Amount) FROM Master M INNER JOIN Detail D ON M.ID = D.MasterID WHERE D.PID IN (1,2,3) 

结果应该是。但我得到
请参阅this fiddle。任何建议?

回答

2

由于详细信息表对WHERE子句中的每个PID都有两个出现,因此您正在获得两倍的金额。

demo

使用

SELECT SUM(Amount) 
FROM Master M 
WHERE M.ID IN (
    SELECT DISTINCT MasterID 
    FROM DETAIL 
    WHERE PID IN (1,2,3)) 
0

什么是细节加入了主表时,你把所有的列是主表的要求。

此外,没有任何FK relationhsip定义在这些表上。看看你的数据,在我看来,MasterId的细节表上应该有FK。如果是这种情况,那么你根本不需要加入表格。

此外,如果你想确保你有细节表中的记录,你需要总和的记录,并且没有FK关系。然后你可以尝试存在而不是加入。

+0

再次看到问题。我想要在(1,2,3)(pid仅详细说明)中的详细信息表的pid中的金额主表的总和。 – hims056 2012-07-14 05:28:16

+0

然后使用存在。 SELECT SUM(Amount) FROM Master M WHERE exists( SELECT 1 FROM DETAIL D WHERE PID IN(1,2,3)and d.MasterId = M.id) – 2012-07-14 15:30:42