我有一个表(A)列出了一天内从机器创建的所有包。它列出了创建的日期和捆绑的重量。我有一个ID列,一个日期列和一个权重列。我还有一张表(B),其中包含当天与该机器相关的详细信息。在该表(B)中,我想要一个列,列出日期匹配的另一个表(A)中的权重总和。因此,如果机器在一天内运行30个捆绑包,那么表格(A)中的30行将在同一天生效。在表格(B)中,我将有1行详细说明当天机器的其他信息以及保存当天创建的总捆绑重量的列。
有没有办法让表(B)中的总列在表(A)中添加行时自动调整?是否可以在表模式本身中执行,而不是每次添加包时在SQL语句中执行此操作?如果不是,我需要什么样的SQL语句?
韦斯
答案 0 :(得分:4)
除非遇到需要它的性能问题,否则这样做是错误的。
更好的方法是在数据库中定义一个视图,该视图将按机器聚合每日捆绑包:
CREATE VIEW MachineDailyTotals
(MachineID, RunDate, BundleCount, TotalWeight)
AS SELECT MachineID, RunDate, COUNT(*), SUM(WeightCol)
FROM BundleListTable
GROUP BY MachineID, RunDate
这样,您可以始终在每台机器上查看正确的,更新的总重量,而不会对数据库施加任何负担,直到您实际查看数据为止。您可以使用机器表执行简单的OUTER JOIN以获取有关机器的信息,包括每日总信息,而无需在任何地方实际存储总计。
答案 1 :(得分:1)
如果您需要实时总和(或其他聚合),请在表A上为INSERT,UPDATE,DELETE添加一个触发器,它计算要存储在B中的总和。
否则,添加计算总和的每日作业。
请指定您正在使用的数据库。
答案 2 :(得分:1)
您确定不想动态提取此信息而不是将其存储在单独的表中吗?这似乎是间接违反规范化规则,因为您将在两个不同的地方存储相同的信息。使用动态查询,您始终确保派生信息正确无需担心触发器的编码和维护。
当然,如果您处理大量数据并且查询时间正在成为一个问题,您可能需要摘要表的快捷方式。但是,总的来说,我会反对它。
答案 3 :(得分:0)
这可以通过触发器来完成,触发器是在表上发生某个动作(插入/更新/删除)时执行的少量代码。语法因供应商(MySQL与Oracle)而异,但语言通常与您编写存储过程的语言相同。
如果你提到数据库类型我可以帮助实际的语法