【问题标题】:MS SQL Computed columnMS SQL 计算列
【发布时间】:2015-06-18 22:26:34
【问题描述】:

我想在另一个表上创建一个基于 COUNT(*) 的列,当从该表中删除一条记录时,它应该减少这个新列中的值,反之亦然。所以,这里是查询:

由 dbo.Korisnik1_FakturaStavka.FakturaID 从 dbo.Korisnik1_FakturaStavka 组中选择计数 (*)

它返回这个:

当我尝试创建这样的计算列时:

创建表测试( NumberOF as (SELECT COUNT (*) FROM dbo.Korisnik1_FakturaStavka GROUP BY dbo.Korisnik1_FakturaStavka.FakturaID))

我收到以下错误:

Subqueries are not allowed in this context. Only scalar expressions are allowed.

这是我要计算的主表:

我该如何解决这个问题?

【问题讨论】:

  • 首先...坏主意...没有形式化...为什么要在数据库中保留可以轻松计算的数据...?如果你真的想这样做,我建议使用与在另一个表中添加或删除行相关联的触发器......但是如果它是一个有很多“活动”的表,这对于服务器来说可能会变得很耗时"在里面
  • 您可以创建一个进行计数的Indexed View,然后,如果您需要此数据出现在另一个表中,您可以创建一个看起来像您想要的最终表,但只是将表(没有计算列)连接到索引视图。
  • (例如,我刚刚在另一个有类似要求的问题上发布了answer
  • 我想保留这个数字,因为我无法创建第二个自动增量列,所以第二个列 StavkaBroj 必须是 1,2,3... 取决于 FakturaID,例如:@ 987654323@,现在从我保留的那个号码,我将手动增加它并将其分配给 StavkaBroj
  • @Damien_The_Unbeliever ye这可能会解决问题,我认为有一个更简单的方法

标签: sql sql-server sql-server-2008


【解决方案1】:

可以定义一个UDF:

create function dbo.NumberOfFakturaID(@id int) returns int as begin
  return (select count(1) from Korisnik1_FakturaStavka where id=@id)
end

然后将其用作计算列:

CREATE TABLE test(FakturaID int, NumberOF as dbo.NumberOfFakturaID(FakturaID))

但是应该小心使用这种计算作为计算列。

【讨论】:

  • 谢谢,这是我所需要的,但是这可能是个坏主意,所以当行受到影响时最好进行查看和触发。
  • 部分取决于你想如何使用它。如果您需要检查它是否恒定,您可能希望通过触发器保持运行总计。但是,如果您只是偶尔获得它,那么视图可能会更好。如果您实际上并没有真正处于从未有人执行 SELECT * 的环境中,那么 UDF 就不是悲剧。
【解决方案2】:

评论太长了。

您可以通过定义一个函数来计算计数并在计算列定义中使用该函数来做到这一点。但是,我认为这对于经常使用的列来说不是一个好主意,因为您将在“幕后”进行大量计算。

替代方案:

  • 使用额外的计数列设置视图或实体化视图。
  • 在需要时明确计数。
  • 每当从第二个表中插入/更新/删除行时,设置一个触发器以将计数存储在第一个表中。

【讨论】:

  • 对,这似乎是比我更好的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 2021-07-26
  • 2019-06-28
  • 2020-08-29
  • 1970-01-01
相关资源
最近更新 更多