2014-04-20 83 views
0

示例我在Employee中具有一些具有以下字段的值。合併具有相同主鍵的兩個表

CREATE TABLE Department (
D#  NUMBER(5) NOT NULL, /* Department number  */ 
DName  VARCHAR2(30) NOT NULL, /* Department name  */ 
Manager# CHAR(5)  NOT NULL, /* Department manager number */ 
MSDate  DATE,    /* Manager start date   */ 
    total_staff_number NUMBER(3), 
CONSTRAINT Department_PK PRIMARY KEY(D#), 
CONSTRAINT Department_CK UNIQUE(DName) 
); 

CREATE TABLE Employee (
E#  CHAR(5)  NOT NULL, /* Employee number  */ 
Name  VARCHAR2(30) NOT NULL, /* Employee name  */ 
    D#  NUMBER(5),  /* Department number  */ 
CONSTRAINT Employee_PK PRIMARY KEY(E#), 
CONSTRAINT Employee_FK2 FOREIGN KEY (D#) REFERENCES Department (D#) 
); 

在我的數據庫中。 DEPARTMENT ='SPORTS'= D#= 5,DEPARTMENT ='GAMES'= D#= 3; 合併部門= '體育' INTO DEPARTMENT = '遊戲',和經理仍然會保持不變,則employee.D#= 5將變更爲employee.D#= 3

MERGE INTO EMPLOYEE TARGET 
USING EMPLOYEE SOURCE WHERE D#=5 ON (
TARGET.D# = SOURCE.D#; 
} 
WHEN MATCHED THEN 
UPDATE SET SOURCE.D#=3; 
UPDATE DEPARTMENT.D# SET total_staff_number = total_staff_number - 1 where DEPARTMENT.D# = SOURCE.D#; 
UPDATE DEPARTMENT.D# SET total_staff_number = total_staff_number - 1 where DEPARTMENT.D# = TARGET.D#; 

但我的邏輯似乎是錯的。 任何解決方案?

+0

1)您的部門表中沒有total_staff_number列; 2)你爲什麼要減少源和目標總數,你應該增加源,減少目標; 3)更改total_staff_number列後,更新您的source.d#。如果你這樣做,你就失去了價值「3」。上兩次更新操作期間,兩列的值均爲「5」。 – yalpertem

+0

@yigitalp 我已用total_staff_number進行編輯。我改變我的數據庫中的表。 嗯。不確定哪一個應該減少/增加。問題是,當運動員工合併到該部門時,遊戲員工將增加。那麼我該怎麼做呢? – user3553846

回答

0

將員工從體育轉移到遊戲只需將更新列指向新部門即可。問題在於你以後要做些什麼?

對於在體育中工作的所有員工,更改爲遊戲。

update employee 
    set d# = 3 
where d# = 5; 

計數員工的部門運動會NR,並更新員工的計數器。

update department 
    set total_staff_number = (
      select count(*) 
      from employee 
      where d# = 3 
     ) 
where d# = 3; 
+0

從你的代碼我看不到任何合併命令,這意味着這實際上不需要使用合併命令也可以合併數據在一起? – user3553846

+0

當您需要插入或更新時,通常會使用合併語句。從你的描述中,我明白你在哪裏「合併部門」,而不是真的在數據庫意義上合併。 – Ronnis

相關問題