查询一个表圈

时间:2012-06-29 21:32:12

标签: sql ms-access database-design

我很好奇如何从表格的“圆圈”中获取所需的数据。

我有5个表(以及一些支持表):通过联结表连接的3个实体。所以一般模型是这样的:

有多个预算帐户有多个预算帐户有很多

所以我的关系通过联结表形成一个圆圈,形成卡到预算到账户回卡,这个结构一切正常,花花公子直到今天我试图使用所有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.)

如你所见,它是一个圆圈。我要完成的是返回一行有两列:Budget.limitAccount的总和typeId = 1Budget.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])); 的行。

根据建议,我实际上可以从联合获取我需要的数据,但如果数据不在两个单独的列中,则对我没用:

{{1}}

2 个答案:

答案 0 :(得分:1)

因此,如果我理解正确,您已经使用相同的名称制作了单独的列标题,因此您的数据会因为信息需要分开而变得不正确?如果是这种情况,我建议您按照提议更改列标题,或者将两个查询链接在一起。通过查询相同的标记名称来连接数据将合并结果。如果要指定某些内容,最好为列标题创建单独的名称。

以下是使用SQL查询多个表的说明:http://www.techrepublic.com/article/sql-basics-query-multiple-tables/1050307

答案 1 :(得分:0)

首先查询卡片,然后与帐户

的查询联合

虽然将卡与帐户相关联然后只有帐户预算会更容易,但我不知道这是否适用于您的架构