SQL Server中如何在同一张表内通过Column_A减Column_B生成Column_C
在SQL Server中用Column_A - Column_B填充Column_C的两种实现方案
嘿,这个需求在SQL Server里其实有两种实用的实现方式,根据你的实际场景选就行:
方案一:一次性更新现有数据(适合静态填充)
如果你的Column_C是普通数值列,只是需要把当前表中所有行的Column_A - Column_B结果填充进去,后续数据变更不需要自动同步,那直接用UPDATE语句就搞定了:
UPDATE 你的表名 SET Column_C = Column_A - Column_B -- 可选:如果要处理空值,避免结果为NULL,可以用ISNULL/COALESCE -- SET Column_C = ISNULL(Column_A, 0) - ISNULL(Column_B, 0)
注意:执行这个语句前最好先备份数据,或者用
SELECT Column_A - Column_B FROM 你的表名先预览结果,确保符合预期再执行更新。
方案二:创建计算列(自动同步,一劳永逸)
如果希望Column_C始终自动保持Column_A - Column_B的最新结果,不需要每次手动更新,那计算列是最佳选择。计算列分为两种:
2.1 非持久化计算列(默认)
这种计算列不会把结果存储在磁盘上,每次查询时才计算,适合不频繁查询的场景,节省存储空间:
-- 如果Column_C还没创建: ALTER TABLE 你的表名 ADD Column_C AS (Column_A - Column_B); -- 如果Column_C已经存在,要改成计算列: ALTER TABLE 你的表名 DROP COLUMN Column_C; GO ALTER TABLE 你的表名 ADD Column_C AS (Column_A - Column_B);
2.2 持久化计算列
如果Column_C会被频繁查询,或者需要基于它创建索引,那就用持久化计算列,结果会存储在磁盘上,查询更快:
ALTER TABLE 你的表名 ADD Column_C AS (Column_A - Column_B) PERSISTED;
小提示:同样要注意空值问题,如果允许
Column_A或Column_B为NULL,建议把计算式改成ISNULL(Column_A, 0) - ISNULL(Column_B, 0),避免得到NULL结果。
内容的提问来源于stack exchange,提问作者Biddut
相关产品推荐
相关产品推荐

