2016-04-24 165 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