我有两张桌子:
的 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。有什么建议吗?
答案 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关系。然后你可以尝试存在而不是加入。