SQL将重复行引用到其他表

SQL将重复行引用到其他表,sql,oracle,Sql,Oracle,我有两张这样设计的桌子 CREATE TABLE employee ( id INT PRIMARY KEY, name VARCHAR(200) ); CREATE TABLE job ( id INT PRIMARY KEY, name VARCHAR(200), emp_id INT, FOREIGN KEY (emp_id) REFERENCES employee(id) ); insert into employee (id, na

我有两张这样设计的桌子

CREATE TABLE employee
(
    id INT PRIMARY KEY,
    name VARCHAR(200)
);

CREATE TABLE job
(
    id INT PRIMARY KEY,
    name VARCHAR(200),
    emp_id INT,
    FOREIGN KEY (emp_id) REFERENCES employee(id)
);

insert  into employee (id, name) values (1, 'user1');
insert  into employee (id, name) values (2, 'user2');
insert  into employee (id, name) values (3, 'user3');
insert  into job (id, name, emp_id) values (1, 'job1', 1);
insert  into job (id, name, emp_id) values (2, 'job2', 2);
insert  into job (id, name, emp_id) values (3, 'job3', 3);
insert  into job (id, name, emp_id) values (4, 'job3', 3);
我需要的是 质询 将用户1,2,3复制为4,5,6,但同时,与用户1,2,3引用的一组旧作业1,2,3,4将被复制为作业5,6,7,8,新用户4,5,6将引用新的5,6,7,8

因此,查询之前的结果

Job Table:
id  name    emp_id
1   t_job1  1
2   t_job2  2
3   t_job3  3
4   t_job3  3

Employee table:
id  name
1   user1
2   user2
3   user3
运行复制user1,2,3的查询后:

Job Table:
id  name    emp_id
1   t_job1  1
2   t_job2  2
3   t_job3  3
4   t_job3  3
5   t_job1  4
6   t_job2  5
7   t_job3  6
8   t_job3  6

Employee table:
id  name
1   user1
2   user2
3   user3
4   user1
5   user2
6   user3
这是一个理想的情况,但在我们真正研究的代码中,工作和员工之间的关系是无限的

那么,如何通过查询实现这一点呢? 首先,我不能改变表格结构,如果可以的话,我会的

连接以下链接:


我们使用的是oracle,但我将示例放在MySQL下。

如上所述,答案可能取决于正在使用的数据库系统。下面提到的是为SQLServer构建的工作代码。希望这有帮助-

DECLARE @NewEmployee AS TABLE (id INT, [name] VARCHAR(200));
DECLARE @NewJob AS TABLE (id INT, [name] VARCHAR(200), emp_id INT);

DECLARE @Max INT, @i INT = 0;

INSERT INTO @NewEmployee (id, [name])
SELECT e.id + m.MaxId, e.[name]
FROM employee e
    CROSS APPLY(SELECT max(id) MaxId FROM employee) m;

INSERT @NewJob (id, [name])
SELECT J.id + m.MaxId id, J.[name]
FROM job j
    CROSS APPLY(SELECT max(id) MaxId FROM job) m;

SELECT @Max = MAX(id), @i = MAX(id) - COUNT(1) + 1 FROM @NewJob;

WHILE @i <= @Max
BEGIN
    UPDATE nj
    SET nj.emp_id = ISNULL(ne.id, me.id)
    FROM @NewJob nj
       CROSS APPLY (SELECT MIN(id) id FROM 
                (   SELECT e.id id FROM @NewEmployee e
                    EXCEPT
                    SELECT emp_id id FROM @NewJob) T) ne
       CROSS APPLY (SELECT MAX(e.id) id FROM @NewEmployee e) me
    WHERE nj.id = @i
    SET @i = @i + 1;
END;

INSERT INTO employee
SELECT * FROM @NewEmployee;

INSERT INTO job
SELECT * FROM @NewJob;

SELECT * FROM employee;
SELECT * FROM job;

为什么所有的数据库平台标签?这个问题还不清楚。解决方案可能因平台而异。删除了不相关的平台。可能在此处生成更清晰的结果。尝试添加示例以查看是否清晰。为什么要复制用户?