这与查询无关,我想知道的是,是否可以将列中的字段显示为其他字段的总和。有点像Excel。
作为一个例子,我有两个表:
食谱
nrecepie integer
name varchar(255)
time integer
和另一个
说明
nintrucion integer
nrecepie integer
time integer
所以,基本上,作为一个配方有我想要的指令
recipes.time = sum(intructions.time)
这可以在create table脚本中完成吗?如果是这样,怎么样?
答案 0 :(得分:4)
您可以使用视图:
CREATE VIEW recipes_with_time AS
SELECT nrecepie, name, SUM(Instructions.time) AS total_time
FROM Recepies
JOIN Instructions USING (nrecepie)
GROUP BY Recepies.nrecepie
如果您确实希望在真实表中包含该数据,则必须使用触发器。
答案 1 :(得分:2)
这可以通过INSERT/UPDATE/DELETE
触发器完成。每次在表Instructions
中更改数据时,触发器都会运行并更新value
中的Recepies
时间。
答案 2 :(得分:0)
每次更改指令表时,您都可以使用触发器更新时间列,但更“正常”(更少冗余)的方式是通过指令之间的连接上的group by子句计算时间列。 recepies [sic] table。
答案 3 :(得分:0)
取决于数据库供应商...例如,在SQL Server中,您可以创建一个列,该列根据同一行中其他列的值计算其值。它们被称为计算列,你这样做:
Create Table MyTable
(
colA Integer,
colB Integer,
colC Intgeer,
SumABC As colA + colB + colC
)
一般情况下,只需输入所需的列名,单词“as”以及公式或公式来计算值。这种方法不使用aditonal存储,它会在每次有人执行select aganist时计算值,因此表格配置文件仍然更窄,并且您可以获得更好的性能。唯一的下行代码是您无法在计算列上放置索引。 (尽管SQL服务器中有一个标志,允许您指定数据库在创建或更新时应该保留该值...在这种情况下可以将其编入索引)
但是,在您的示例中,您正在访问另一个表中多行的数据。为此,您需要其他响应者建议的触发器。
答案 4 :(得分:0)
通常,您希望避免这种情况,因为您存储的是派生信息(出于性能原因,存在例外情况)。因此,最好的解决方案是按照AndreKR的建议创建一个视图。这提供了一个总是正确的总数,从数据库中选择就像在实际的存储列中一样容易。