这次我无法在 CREATE TABLE 命令中创建派生列。我尝试使用 Alter Table 但发现以下错误:
“在此上下文中不允许子查询。仅允许标量表达式。”
我的数据库:
CREATE TABLE Bem (
ID INT PRIMARY KEY IDENTITY(1,1),
PRECO INT,
NOME VARCHAR(128),
CATEGORIA VARCHAR(128)
);
CREATE TABLE Orcamento (
ID INT PRIMARY KEY IDENTITY(1,1),
Nome VARCHAR(128),
Valor INT
);
CREATE TABLE Inventario (
ID_Bem INT FOREIGN KEY REFERENCES Bem(ID),
ID_Orc INT FOREIGN KEY REFERENCES Orcamento(ID),
PRIMARY KEY (ID_Bem,ID_Orc)
);
我希望 Orcamento(Valor) 成为派生列,即 Inventorio 表中找到的与 Orcamento ID 匹配的每个项目的 Bem(Preco) 总和。
这就是我尝试过的:
ALTER TABLE Orcamento
ADD ValorT
AS
(SELECT SUM(Bem.Preco)
FROM Bem, Inventario
WHERE Bem.ID = Inventario.ID_Bem
AND Inventario.ID_Orc = Orcamento.ID
)
;
使用 UPDATE 有效,但每次我向 Inventario 表添加数据时都必须运行此 UPDATE。我想知道更好的选择
每次想要更新列时手动运行它可能会很困难。创建一个标量 UDF 来填充它是有意义的,如下所示:
标量 UDF
CREATE FUNCTION dbo.GetOrcamentoValor (@OrcamentoID INT)
RETURNS INT
AS
BEGIN
DECLARE @Valor INT;
SELECT @Valor = SUM(Bem.Preco)
FROM Bem
JOIN Inventario ON Bem.ID = Inventario.ID_Bem
WHERE Inventario.ID_Orc = @OrcamentoID;
RETURN ISNULL(@Valor, 0);
END;
此后,更改 Orcamento 表以使用 UDF 添加计算列:
ALTER TABLE Orcamento
ADD Valor AS dbo.GetOrcamentoValor(ID);
每当您在 Orcamento 表中插入或更新一行时,都会使用标量 UDF 中定义的逻辑自动计算 Valor 列。