获取与详细信息表连接的MasterTable数量的总和

时间:2012-07-14 05:13:01

标签: sql sql-server tsql join sum

我有两张桌子:
1。主

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

结果应为 20000 。但我得到 40000
this fiddle。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您获得的金额恰好是两倍,因为详细信息表对WHERE子句中的每个POD都有两次出现。

请参阅demo

使用

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

答案 1 :(得分:0)

当所有列都在主表中时,加入主表的要求是什么。

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

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