2014-02-28 132 views
1

我是SQL新手,仍然在学习DBMS。如何根据另一列中的值更新一列中的值

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

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

我需要一个解决方案,以便在ApprovalID中的值发生变化时自动更新Approval中的值,而不是1,2,3,4,5我想显示上面提到的字符串

请帮忙。而不是

+1

你真的应该有一个存储ApprovalIDs和他们的名字一个表,然后针对它 – Lamak

+1

执行'JOIN'你会以错误的方式去做。您应该将'approval'列提取到另一个具有两列的静态表,即'approval_id'和'approval',并且在想要显示“批准”字符串时对原始表使用'join'。这个过程被称为[规范化](http://en.wikipedia.org/wiki/Database_normalization)。 – Mureinik

+0

计算列在这里是正确的选择,因为“批准”是“ApprovalID”的直接翻译。您可以创建UDF来转换值并将该udf用作列“批准”定义。 –

回答

1

: -

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 

这是一个开始。有很多事情你也需要了解与主键和索引...

0

您可以使用多种approuches做到这一点:

计算列

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 
相关问题