SQL SSMS中创建两个表时,如何在第二个表的计算列中引用第一个表的列值进行乘法运算?
解决跨表引用计算列的问题
首先得明确:从你的语法来看应该是用SQL Server,它的计算列默认只能引用当前表的列,没法直接跨表调用其他表的字段。不过有几种办法能实现你要的“用表a的hours乘以CASE结果”的需求,我分场景给你说明:
场景1:表a是单一行的配置表(比如全局存一个hours值)
如果表a只有一条记录(比如用来存全局的小时数配置),那直接在计算列里加个返回单一值的子查询就行:
-- 先创建表a并插入测试数据 CREATE TABLE a( [hours]int NOT NULL ) INSERT INTO a VALUES (8) -- 假设这里是你要的小时数 -- 创建表b,计算列里直接嵌套子查询取表a的hours CREATE TABLE b( [example] varchar(60) NOT NULL PRIMARY KEY, -- 建议把列名改成更贴合用途的,比如calculated_hours [calculated_hours] AS ( (CASE WHEN example = 'name' THEN 40 WHEN example = 'name2' THEN 45 END) * (SELECT TOP 1 hours FROM a) -- TOP 1确保只返回一个值,避免报错 ) )
测试一下:插入INSERT INTO b VALUES ('name'),查询表b就能得到40*8=320的结果,表a的hours更新后,计算列的值也会自动跟着变(因为是非持久化的)。
场景2:表a有多行数据,表b和表a是关联关系
如果表a有多个hours记录,且表b的每一行都对应表a的某一行(比如通过外键关联),那可以用标量函数来实现:
第一步:给表a加主键,方便关联
CREATE TABLE a( a_id INT IDENTITY(1,1) PRIMARY KEY, -- 新增主键列 [hours]int NOT NULL ) INSERT INTO a VALUES (8), (10) -- 插入多条测试数据
第二步:创建标量函数,根据a_id获取对应的hours
CREATE FUNCTION dbo.GetHoursByAId(@a_id INT) RETURNS INT AS BEGIN DECLARE @target_hours INT SELECT @target_hours = hours FROM a WHERE a_id = @a_id RETURN @target_hours END
第三步:创建表b,关联表a并调用函数计算
CREATE TABLE b( [example] varchar(60) NOT NULL PRIMARY KEY, a_id INT NOT NULL FOREIGN KEY REFERENCES a(a_id), -- 外键关联表a [calculated_hours] AS ( (CASE WHEN example = 'name' THEN 40 WHEN example = 'name2' THEN 45 END) * dbo.GetHoursByAId(a_id) ) )
比如插入INSERT INTO b VALUES ('name', 1),就会得到40*8=320;插入('name2',2)得到45*10=450。
更推荐的替代方案:用视图代替计算列
如果你的需求只是查询时得到计算结果,不需要把这个值存在表b里,那用视图会更灵活,性能也更好(标量函数在大数据量下可能有性能问题):
-- 先创建基础表a和b(表b包含a_id外键) CREATE TABLE a( a_id INT PRIMARY KEY, [hours]int NOT NULL ) CREATE TABLE b( example varchar(60) PRIMARY KEY, a_id INT NOT NULL FOREIGN KEY REFERENCES a(a_id) ) -- 创建视图关联两个表并计算 CREATE VIEW vw_b_calculated AS SELECT b.example, (CASE WHEN b.example = 'name' THEN 40 WHEN b.example = 'name2' THEN 45 END) * a.hours AS calculated_hours FROM b INNER JOIN a ON b.a_id = a.a_id
直接查询这个视图就能得到你要的结果,而且不需要维护计算列的依赖关系。
内容的提问来源于stack exchange,提问作者Take it easy
相关产品推荐
相关产品推荐

