繁体   English   中英

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

[英]How to update values in one column based on the values in another column

我是SQL的新手,仍然在学习DBMS的内容。

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

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

如果需要更改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')

在需要说明时,从tablea中删除批准列,然后执行以下操作:

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

但是最好的方法是在两个表上拆分数据

CREATE TABLE t3
(
    ID INT IDENTITY(1,1),
    ApprovalID INT,
)

CREATE TABLE Approval
(
   ApprovalID INT,
   Name NVARCHAR(256)
)

INSERT INTO Approval(ApprovalID, Name) VALUES( 1, 'Hatchery' )
INSERT INTO Approval(ApprovalID, Name) VALUES( 2 , 'Purchase')
INSERT INTO Approval(ApprovalID, Name) VALUES( 3, 'Rearing' ) 
INSERT INTO Approval(ApprovalID, Name) VALUES( 4, 'Source Unknown' ) 
INSERT INTO Approval(ApprovalID, Name) VALUES( 5, 'Not Approved' )

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)

并用于选择数据查询,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM