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