2016-04-24 111 views
0

当前正在研究篮球性能数据库。我遇到的问题是存储比赛的胜者。 对照表目前像这样:在ORACLE中插入数据时根据条件设置列

CREATE TABLE Matches(
M_ID int CONSTRAINT pk_Match PRIMARY KEY, 
M_Date Date NOT NULL, 
M_Location varchar(20), 
M_HomeTeam int NOT NULL, 
M_AwayTeam int NOT NULL, 
M_HomeScore int NOT NULL, 
M_AwayScore int NOT NULL, 
M_Winner int, 
CONSTRAINT fk_TeamHome foreign key (M_HomeTeam) REFERENCES Team(T_ID), 
CONSTRAINT fk_TeamAway foreign key (M_AwayTeam) REFERENCES Team(T_ID) 
) 

我要的是M_Winner的值设置为M_HomeTeam &根据自己的分数M_AwayTeam外键。 我已经能够用这条update语句

UPDATE Matches 
SET M_Winner = CASE 
WHEN M_HomeScore > M_AwayScore 
THEN M_HomeTeam 
WHEN M_AwayScore > M_HomeScore 
THEN M_AwayTeam 
END; 

做到这一点不过,我需要插入数据时,它的工作。 任何想法?

+0

作为@GordonLinoff会在30秒内告诉你,你可以使用触发器来做到这一点。 –

+0

错误:-)他有一个更好的解决方案。 – trincot

回答

2

在Oracle 11g中+触发器,您可以使用虚拟计算列:

ALTER TABLE matches 
    ADD m_winner as (CASE WHEN M_HomeScore > M_AwayScore 
          THEN M_HomeTeam 
          WHEN M_AwayScore > M_HomeScore 
          THEN M_AwayTeam 
        END) 
+0

不错,不知道! – trincot

+0

工作过,非常感谢! – hollow

1

您可以定义一个触发器:

CREATE OR REPLACE TRIGGER trg_ins_match 
BEFORE INSERT ON Matches 
    FOR EACH ROW 
BEGIN 
    IF :new.M_HomeScore > :new.M_AwayScore THEN 
     :new.M_Winner = :new.M_HomeTeam 
    ELSE 
     :new.M_Winner = :new.M_AwayTeam 
    END IF; 
END; 

阅读有关在Oracle Developer's Guide