在 Access 中使用一个 Table 中另一个 Table 中的数据

Using Data from One Table in Another Table in Access

你好 Whosebug 用户

我正在努力在 Access 数据库 table 之间传输值,我将在 Delphi 程序中使用它来计算选举票数并确定获胜候选人。我总共有六个 table。一个是我的整体 table,tblCandidates,它标识每个候选人并包含他们从每一方(即年级负责人、教师和学生)收到的选票数量。对于学习者,我们有四个参与年级,即 8 年级、9 年级、10 年级和 11 年级,每个年级又有多个参与 classes,即 class A、B、C 等.

现在,我已经为包含该年级所有 class 的每个年级设置了 table。我将这些 tables 命名为 tblGrX,其中 X 表示 8 到 11 的等级。这些 tables 中的每一个都有两个额外的字段,即一个用于识别候选人的字段和一个将加起来的字段该候选人从该年级的每个 classes 获得的所有选票。最后,我还有另一个 table,带有字段 Total_GrX 的 tblGrTotals(再次以 X 表示等级),它将包含候选人从每个等级收到的所有总票数,将它们加到另一个字段中以供我使用tblCandidates table 在其 Total_Learners 字段中使用。

所以简而言之,例如,我希望 tblGrTotals 在其 Total_Gr8 字段中使用 tblGr8 字段 Total 中的值,然后 tblCandidates 在其 Total_Learners 字段。有没有什么方法可以让这些值在 table 之间更新,就像单元格在 Excel 中更新时发生更改一样?

提前致谢!

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

想想你正在建模的对象。

  • 候选人 - 这很简单。 ID、姓名,也许还有属于每个候选人的其他信息。但是这里没有关于投票的内容。

  • "Groups that are voting" 或派对。并非如此微不足道,因为派对的类型不同。我仍然会把它们放在一个 table 中,只为学习者设置等级和 Class,为校长和教师设置 NULL。

例如

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

例如

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

现在:如果你想知道Class8A的得票数:

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

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

对于您加入 Candidates with Votes 的每个候选人的选票。

编辑:
对于不同的票数,这是 Party_Type.
的一个属性 我们还没有他们的table,所以创建一个:

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

使用这样的设计,您无需不断将数据从一个 table 更新到另一个 - 您可以在需要的时间和方式计算它,它始终是最新的。
数据库的魔力。 :)