2016-12-06 63 views
2

我有兩個這樣設計的表。參考其他表的SQL重複行

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); 

而我需要的是 查詢 複製user1,2,3爲4,5,6,但同時,老的工作1,2,3,4的被引用用戶1,2,3將被複製爲作業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 

這是一個理想的情況下,但我們真正的工作的代碼,有工作和僱員之間的關係不確定的量。

那麼如何實現查詢? 首先,我不能改變表格結構,如果可以的話,我會的。

附上鍊接: http://sqlfiddle.com/#!9/de15f/1

我們使用的是Oracle,但我是把MySQL下的示例。

+0

爲什麼所有的db平臺標籤?問題不清楚。解決方案可能因平臺而異。 – OldProgrammer

+0

刪除不相關的平臺。 –

+1

也許在這裏做出更清晰的結果。 –

回答

0

如上所述,答案可能取決於正在使用的數據庫系統。下面提到的是爲SQL Server構建的工作代碼。希望這可以幫助。 :-)

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;