Sql 如何基于另一列中的值更新一列中的值

Sql 如何基于另一列中的值更新一列中的值,sql,sql-server,Sql,Sql Server,我是SQL新手,仍然在学习DBMS的内部和外部 我有一个表,其列名为ApprovalID,类型为int,值为1-5。(这些值由网站上运行的代码更新。 我有另一个名为Approval的列,我从ApprovalID列值复制了它,但它是varchar类型,并显示字符串(孵化器为1,购买为2,饲养为3,来源未知为4,未批准为5) 现在Approval列不会自行更新,如果ApprovalValid列中的相应值已更改,我必须手动运行查询以更改其中的值 我需要一个解决方案,如果ApprovalID中的值已更改

我是SQL新手,仍然在学习DBMS的内部和外部

我有一个表,其列名为ApprovalID,类型为int,值为1-5。(这些值由网站上运行的代码更新。 我有另一个名为Approval的列,我从ApprovalID列值复制了它,但它是varchar类型,并显示字符串(孵化器为1,购买为2,饲养为3,来源未知为4,未批准为5)

现在Approval列不会自行更新,如果ApprovalValid列中的相应值已更改,我必须手动运行查询以更改其中的值

我需要一个解决方案,如果ApprovalID中的值已更改,则自动更新Approval中的值,但我希望显示上述字符串,而不是1,2,3,4,5

请帮助。

而不是:-

select approvalid, approval, othercolumn, anothercolumn
from tablea
这样做一次:-

create tableb (
    approvalid int,
    approval varchar(50)
)

insert into tableb values (1, 'Hatchery')
insert into tableb values (2, 'Purchase')
insert into tableb values (3, 'Rearing')
insert into tableb values (4, 'Source Unknown')
insert into tableb values (5, 'Not Approved')
从表A中删除“批准”列,然后在需要说明时执行此操作:-

select a.approvalid, b.approval, a.othercolumn, a.anothercolumn
from tablea a
join tableb b on b.approvalid=a.approvalid

这是一个开始。您还需要了解很多东西,例如主键和索引…

您可以使用几种方法来实现这一点:

计算列

CREATE TABLE t3
(
    ID INT IDENTITY(1,1),
    ApprovalID INT,
    Approval AS ( CASE 
                    WHEN ApprovalID = 1 THEN 'Hatchery'
                    WHEN ApprovalID = 2 THEN 'Purchase' 
                    WHEN ApprovalID = 3 THEN 'Rearing' 
                    WHEN ApprovalID = 4 THEN 'Source Unknown' 
                    WHEN ApprovalID = 5 THEN 'Not Approved'
                    ELSE '<Unknown approval state>' 
                END
        )  PERSISTED
)

INSERT INTO t3(ApprovalID) VALUES(1)
INSERT INTO t3(ApprovalID) VALUES(2)
INSERT INTO t3(ApprovalID) VALUES(3)
INSERT INTO t3(ApprovalID) VALUES(4)
INSERT INTO t3(ApprovalID) VALUES(5)
UPDATE t3 
    set ApprovalID = 2
    where ApprovalID = 1
SELECT * FROM t3
DROP TABLE t3
CREATE TABLE t3
(
    ID INT IDENTITY(1,1),
    ApprovalID INT,
    Name NVARCHAR(256),
)
GO
CREATE TRIGGER t3_trigger
    ON t3
    AFTER INSERT, UPDATE
    AS
    UPDATE t3 
        SET Name = CASE 
                WHEN i.ApprovalID = 1 THEN 'Hatchery'
                WHEN i.ApprovalID = 2 THEN 'Purchase' 
                WHEN i.ApprovalID = 3 THEN 'Rearing' 
                WHEN i.ApprovalID = 4 THEN 'Source Unknown' 
                WHEN i.ApprovalID = 5 THEN 'Not Approved'
                ELSE '<Unknown approval state>' 
            END
    FROM t3 INNER JOIN inserted i ON t3.ID = i.ID
GO
INSERT INTO t3(ApprovalID) VALUES(1)
INSERT INTO t3(ApprovalID) VALUES(2)
INSERT INTO t3(ApprovalID) VALUES(3)
INSERT INTO t3(ApprovalID) VALUES(4)
INSERT INTO t3(ApprovalID) VALUES(5)

UPDATE t3 set ApprovalID = 2 WHERE ApprovalID = 1

SELECT t3.*, Approval.Name FROM t3 LEFT JOIN Approval ON t3.ApprovalID = Approval.ApprovalID
并用于选择数据查询,如下所示:

SELECT t3.*, Approval.Name FROM t3 LEFT JOIN Approval ON t3.ApprovalID = Approval.ApprovalID

你真的应该有一个存储Approvalid及其名称的表,然后对它执行一个
JOIN
。你应该将
approval
列提取到另一个静态表中,该表有两列-
approval\u id
approval
,并将
JOIN
与当您希望显示
approval
字符串时,使用原始表。此过程被调用。这里选择计算列是正确的,因为“approval”是“ApprovalID”的直接翻译。您可以创建自定义项来翻译值,并将该自定义项用作列“approval”定义。@AnupShah请不要建议为此使用udf创建计算列,它将耗尽performanceSQLCAT:
SELECT t3.*, Approval.Name FROM t3 LEFT JOIN Approval ON t3.ApprovalID = Approval.ApprovalID