【问题标题】:Using Data from One Table in Another Table in Access在 Access 中使用另一个表中的一个表中的数据
【发布时间】:2015-08-26 15:09:27
【问题描述】:

你好 StackOverflow 用户

我正在努力在 Access 数据库表之间传输值,我将在 Delphi 程序中使用这些表来计算选举票数并确定获胜的候选人。我一共有六张桌子。一个是我的整体表 tblCandidates,它标识了每个候选人并包含他们从每一方获得的票数,即年级组长、教师和学习者。对于Learners,我们有四个参与年级,分别是8年级、9年级、10年级和11年级,每个年级又有多个参与班级,即A、B、C等。

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

简而言之,例如,我希望 tblGrTotals 在其 Total_Gr8 字段中使用 tblGr8 的 Total 字段中的值,然后 tblCandidates 在其 Total_Learners 字段中使用 tblGrTotals 的 Total 字段中的值。有什么方法可以在表格之间保持这些值的更新,例如在 Excel 中进行更改时更新单元格?

提前谢谢你!

【问题讨论】:

    标签: database ms-access delphi-xe8


    【解决方案1】:

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

    想想你正在建模的对象。

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

    • “正在投票的团体”或各方。由于聚会的类型不同,这并不是那么微不足道。我仍然会将它们放在一张表中,只为学习者设置成绩和班级,为校长和教师设置 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 |
    +----------+--------------+-----------+
    

    现在:如果你想知道 Class 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 条件即可。

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

    编辑:
    对于不同的计票方式,这是 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
    

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

    【讨论】:

    • 非常感谢您的回答@Andre!我真的很感激,看起来这个设计好像是金色的!但在我将此标记为已回答之前,我忘记提及还有三类选票,即 A 类(成为 BK 的一部分)、B 类(副组长)和 C(组长)。此外,校长和教师的票数每票更多,例如校长票等于 4 票,教师票等于 3 票。我如何将每个班级的候选人的所有选票加起来?
    • 你总是要考虑:一个属性属于你模型中的哪个对象?投票计数属于 Party_Type - 请参阅上面的编辑。 --- 投票等级 A、B、C 我不太明白。如果候选人可以在多个投票类别中被投票,则属于 Votes。如果每个候选人候选人都在一个“班级”中,则投票班级属于候选人
    • 是的,我继续在 tblVotes 中添加了 ClassA、ClassB 和 ClassC 字段。例如,一名候选人在 C 类中获得 20 票,这意味着有 20 人投票支持他/她作为女校长/男校长。候选人可以获得 A 类选票,但不一定是 B 类或 C 类。同样,如果候选人获得 B 类选票,则他/她不能获得 C 类选票,但必须获得 A 类选票,如果候选人获得C 类投票他/她不能获得 B 类投票,但必须获得 A 类投票。
    • 我不太明白您刚刚写的内容 - 但最好设计添加一个具有值“A”、“B”、“C”而不是 3 个字段的字段“Vote_Class”。经验法则:一个属性 = 一列。
    • 非常感谢安德烈的回答!你真的在所有细节和清晰度上都超越了自己!我还有一个问题,你如何像在 Stack Overflow 上那样创建表格?
    猜你喜欢
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多