You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 00:44:08