我很好奇如何从表格的“圆圈”中获取所需的数据。
我有 5 个表(和一些支持表): 3 个由联结表连接的实体。所以一般模型是这样的:
Cards有很多Budgets,Accounts有很多Budgets,Accounts有很多Cards。
所以我的关系通过连接表形成一个圆圈,从卡到预算再到账户再到卡,直到今天,当我尝试使用所有 5 个表构建查询时,这种结构都工作得很好,并且注意到我不知道避免这种结构存在的模糊连接的方法。我认为创建 AccountBudget 和 CardBudget 表可能是一个更好的主意,但是由于它们都将定义完全相同类型的数据,因此一个表似乎更有效。
我试图获取的信息基本上是某种类型的所有卡的总预算限制,以及同一类型的所有帐户的总预算限制。我只是看错了这个问题吗?
// Card Budget_Card Budget Budget_Account Account
// ------- --------- -------- -------------- ---------
// cardId------\ budgetId<---------budgetId------>budgetId -----accountId--(to Card)->
// accountId --->cardId limit accountId<------/ typeId
// (etc) typeId (etc)
// (typeId in Budget is either 1 for an account budget or 2 for a card budget.)
如您所见,它是一个圆圈。我想要完成的是返回一行,其中包含两列:whereBudget.limit
中记录的总和,以及属于同一类型的 s 中的所有行的总和。Account
typeId = 1
Budget.limit
Card
Account
根据建议,我实际上可以从联合中获取我需要的数据,但如果数据不在两个单独的列中,这对我没有用:
SELECT DISTINCTROW Sum(Budget.limit) AS SumOfLimit
FROM (Account RIGHT JOIN Card ON Account.accountId = Card.accountId)
RIGHT JOIN (Budget LEFT JOIN Budget_Card ON Budget.budgetID = Budget_Card.budgetId) ON Card.cardId = Budget_Card.cardId
GROUP BY Budget.typeId, Budget.quarterId, Account.typeId
HAVING (((Budget.typeId)=2) AND ((Budget.quarterId)=[@quarterId]) AND ((Account.typeId)=[@accountType]))
UNION SELECT DISTINCTROW Sum(Budget.limit) AS SumOfLimit
FROM Budget LEFT JOIN (Account RIGHT JOIN Budget_Account ON Account.accountId = Budget_Account.accountId) ON Budget.budgetID = Budget_Account.budgetId
GROUP BY Budget.typeId, Budget.quarterId, Account.typeId
HAVING (((Budget.typeId)=1) AND ((Budget.quarterId)=[@quarterId]) AND ((Account.typeId)=[@accountType]));