【问题标题】:Merge two tables with same primary key合并两个主键相同的表
【发布时间】:2014-04-20 12:24:54
【问题描述】:

例如,我在 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#)
);

在我的数据库中。部门 = '体育' = D# = 5,部门 = '游戏' = D# = 3; 合并 DEPARTMENT='SPORTS' INTO DEPARTMENT='GAMES' ,经理仍然保持不变,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#;

但我的逻辑似乎是错误的。 有什么解决办法吗?

【问题讨论】:

  • 1) 您的部门表中没有 total_staff_number 列; 2)为什么要同时减少源和目标总数,应该增加源,减少目标; 3) 更改 total_staff_number 列后更新您的 source.d#。如果你这样做,你将失去价值“3”。在您的最后两次更新操作中,两列的值都是“5”。
  • @yigitalp 我已经用 total_staff_number 进行了编辑。我改变了我数据库中的表。唔。不确定哪个 1 应该减少/增加。问题是当 Sport 员工并入该部门时,Games 员工会增加。那我该怎么做呢?

标签: sql oracle merge


【解决方案1】:

将员工从 Sports 转移到 Games 将只是更新 departpent 列以指向新部门。问题是你以后要怎么处理悬空部门的运动?

对于所有从事体育工作的员工,请切换到游戏。

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

统计部门游戏中的员工人数,并更新员工计数器。

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

【讨论】:

  • 从你的代码中我看不到任何合并命令,这意味着这实际上不需要使用合并命令也可以将数据合并在一起?
  • merge 语句通常在您需要插入或更新时使用。从您的描述中,我了解到您在“合并部门”的位置,而不是真正意义上的数据库合并。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
相关资源
最近更新 更多