Дублирование нескольких записей в таблице с первичным ключом

Я работаю с дублированием нескольких записей в таблице 1 с первичным ключом, который имеет ссылку на таблицу 2 (внешний ключ)

Рассмотрим таблицу employeeсо столбцами (eID (primary key), ename,dept, dept_code).

Таблица 2 employee_addressсо столбцами (eaid (первичный ключ), eID (внешний ключ), город, страна)

Теперь задача находится в таблице 1 (т. е. сотрудник) может иметь количество значений с различными кодами отдела.

Предположимdept_code, может быть 1 или 2, Как так и так.

Теперь с обоими таблица с некоторыми данными выглядит так

Таблица сотрудник

Eid(pk) ename   dept    Dept_code       
100      Sss    Cse      1      
101      Aaa    Cse      1      
102      Bbb    Cse      1      
103      Ccc    Eee      2      
104      ddd    it       3

Таблица адрес сотрудника

Eaid (pk)   Eid (fk)    city    country
1            100         NY      Us
2            100         NY      Us
3            100         NY      Us
4            101         CALIF   Us
5            102         DC      Us
6            102         DC      Us
7            103         NJ      Us

теперь дело в том, что я должен дублировать все записи в таблице employee, где dept_code=1 и дублировать записи dept_code = 5.

И внешний ключ, ссылающийся на таблицу адресов сотрудников (т. е. здесь в текущем документе 100,101,102) в таблице 2 должно быть продублировано количество раз те значения внешнего ключа, присутствующие в таблице 2.

Я должен получить выход, как это

таблица Employee

Eid(pk) ename   dept    Dept_code       
 100     Sss    Cse       1     
 101     Aaa    Cse       1     
 102     Bbb    Cse       1     
 103     Ccc    Eee       2     
 104     ddd    it        3     
 **105   sss    cse       5     
 106     aaa    cse       5     
 107     bbb    cse       5**

Таблица адрес сотрудника

Eaid (pk)   Eid (fk)    city    country
 1            100        NY       Us
 2            100        NY       Us
 3            100        NY       Us
 4            101       CALIF     Us
 5            102        DC       Us
 6            102        DC       Us
 7            103        NJ       Us
 **8              105        NY       Us
 9            105        NY       Us
 10           105        Ny       Us
 11           106       CALIF     Us
 12           107        DC       Us
 13           107        DC       Us**

Теперь я должен получить выход, как это.

Условия для этой задачи,

  • нет для петли
  • попадание в базу данных должно быть минимальным
  • может использовать java или если possible в самом SQL-запросе.

Я пробовал с различными идеями ничего не получалось.

Помоги мне в этом.

1 ответ

  1. Если я понимаю ваш вопрос, эти два запроса будут работать. Они используют функции окна tSql, если вы не используете Sql Server, то вам нужно будет найти эквивалент.

    Отредактировано, чтобы ответить на комментарий от OP-

    Если вы хотите создать новые таблицы:

    Select * Into EmployeeNew From (
        Select  *
            From Employee E 
        Union All
        Select  Row_Number() Over (Order By eid) + (Select Max(eid) From Employee),
                ename, dept, 5 dept_code
            From Employee 
            Where Dept_Code = 1) A
    
    Select * Into EmployeeAddressNew From (
        Select  A.*
            From Employee E
            Join EmployeeAddress A On A.eid = E.eid
        Union All
        Select  A.eaid + (Select Max(eaid) From EmployeeAddress),
                Dense_Rank() Over (Order By E.eid)  + (Select Max(eid) From Employee),
                City, Country
            From Employee E
            Join EmployeeAddress A On A.eid = E.eid
            Where E.Dept_Code = 1) A
    

    Если вы хотите только вставить «новые» записи в исходные таблицы:

    Insert Employee 
        Select  Row_Number() Over (Order By eid) + (Select Max(eid) From Employee),
                ename, dept, 5 dept_code
            From Employee 
            Where Dept_Code = 1
    
    Insert EmployeeAddress       
        Select  A.eaid + (Select Max(eaid) From EmployeeAddress),
                Dense_Rank() Over (Order By E.eid)  + (Select Max(eid) From Employee),
                City, Country
            From Employee E
            Join EmployeeAddress A On A.eid = E.eid
            Where E.Dept_Code = 1