使用Access中另一个表中的一个表中的数据

时间:2015-08-26 15:09:27

标签: database ms-access delphi-xe8

Hallo StackOverflow用户

我正在努力在Access数据库表之间传输值,我将在Delphi程序中使用它来计算选举投票并确定获胜候选人。我总共有六张桌子。一个是我的整体表格,tblCandidates,用于识别每个候选人,并包含他们从各方获得的投票数量,即成绩负责人,教师和学习者。对于学习者来说,我们有四个参与的成绩,即8年级,9年级,10年级和11年级,每个年级再次有多个参与级别,即A,B,C等等。

现在,我已经为每个年级设置了表格,其中包含该年级的所有课程。我将这些表命名为tblGrX,其中X是由8到11表示的等级。这些表中的每一个都有两个额外的字段,即用于标识候选者的字段和用于将候选者从每个表中获得的所有投票相加的字段。该年级的课程。最后,我有另一个表,tblGrTotals,其字段为Total_GrX(再次以X为等级),其中包含候选人从每个等级收到的所有总票数,将它们添加到另一个字段中,以便我的tblCandidates表在其Total_Learners字段中使用

因此,简而言之,我希望tblGrTotals在其Total_Gr8字段中使用字段Total of tblGr8中的值,然后使用tblCandidates在其Total_Learners字段中使用字段Total of tblGrTotals中的值。是否有任何方法可以在表之间更新这些值,例如单元格在更改时在Excel中更新?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

您需要重新考虑您的桌面设计。我猜您的背景是Excel,您的表格就像在Excel工作表中那样布局,但关系数据库的工作方式不同。

考虑您正在建模的对象。

  • 候选人 - 这很容易。 ID,名称,可能是属于每个候选人的其他信息。但这里的选票却没有。

  • “投票的群组”或缔约方。由于党派的类型不同,并非如此微不足道。我仍然会将它们放在一个表中,只为学习者设置成绩和班级,为校长和教师设置为NULL。

e.g。

+----------+------------+-------+-------+
| Party_ID | Party_Type | Grade | Class |
+----------+------------+-------+-------+
|        1 | Head       |       |       |
|        2 | Teacher    |       |       |
|        3 | Learner    |     8 | A     |
|        4 | Learner    |     8 | B     |
|        5 | Learner    |     8 | C     |
|        6 | Learner    |     9 | A     |
|        7 | Learner    |     9 | B     |
|        8 | Learner    |    10 | A     |
+----------+------------+-------+-------+

e.g。

+----------+--------------+-----------+
| Party_ID | Candidate_ID | Num_Votes |
+----------+--------------+-----------+
|        1 |            1 |         5 |
|        1 |            2 |        17 |
|        3 |            1 |         2 |
|        3 |            2 |         6 |
|        3 |            3 |        10 |
+----------+--------------+-----------+

现在:如果你想知道8A级的投票:

SELECT Candidate_ID, SUM(Num_Votes) 
FROM Parties p INNER JOIN Votes v
  ON p.Party_ID = v.Party_ID
WHERE p.Party_Type = 'Learner'
  AND p.Grade = 8
  AND p.Class = 'A'
GROUP BY Candidate_ID

或所有8年级?只需省略p.Class条件。

对于每个候选人的投票,你加入候选人投票。

编辑:
对于计票方式不同,这是 Party_Type 的属性 我们还没有表格,所以创建一个:

+------------+---------------+
| Party_Type | Multiplicator |
+------------+---------------+
| Head       |             4 |
| Teacher    |             3 |
| Learner    |             1 |
+------------+---------------+

并统计所有选票:

SELECT c.Candidate_ID, c.Candidate_Name, SUM(v.Num_Votes * t.Multiplicator) AS SumVotes
FROM Parties p 
  INNER JOIN Votes v ON p.Party_ID = v.Party_ID
  INNER JOIN Party_Types t ON p.Party_Type = t.Party_Type
  INNER JOIN Candidates c ON v.Candidate_ID = c.Candidate_ID

GROUP BY c.Candidate_ID, c.Candidate_Name

使用这样的设计,您不需要将数据从一个表更新到另一个表 - 您可以在何时以及如何需要时计算它,并且它始终是最新的。
数据库的神奇之处。 :)