使用主键复制表中的多个记录

时间:2016-05-05 11:01:25

标签: sql oracle arraylist duplicates

我正在使用主键复制表1中的多个记录,主键具有表2(外键)的引用

考虑使用列{eid(主键),ename,dept,dept_code)的表employee

表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的所有记录。

表2中引用员工地址表的外键(即当前文件100,101,102中的外键)必须重复表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     
 **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**

现在我必须得到这样的输出。

此任务的条件是,

  • no for loop
  • 命中数据库应该尽可能少
  • 可以使用java或者在sql查询本身中使用。

我尝试了各种各样的想法没有成功。

帮助我解决这个问题。

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,这两个查询就可以了。他们使用tSql窗口函数,如果你不使用Sql Server,那么你需要找到相应的。

编辑回答OP的评论 -

如果要创建新表:

 <div class="col-md-12">
    <section id="amenities-part" class="col-md-6">
        <div>
            <h2>Amenities</h2>
            <span>Lift</span> <br><span>AC</span>
        </div>
    </section>
    <section id="services-part" class="col-md-6">
        <div>
            <h2>Services</h2>
            <span>Cooking</span> <br><span>Cooking</span>
        </div>
    </section>
    <section id="safety-part" class="col-md-6">
        <div>
            <h2>Safety</h2>
            <span>First Aid Kit</span> <br><span>Fire Extinguisher </span>
        </div>
    </section>
    <section id="local-service-part" class="col-md-6">
        <div>
            <h2>Local Area Service</h2>
            <span>jfh</span> <br><span>jfh</span>
        </div>
    </section>
    <section id="handler-detail-part" class="col-md-6">
        <div>
            <h2>Handler Detail</h2>
            <img class="img-responsive" alt="Handler-profile-picture" width="75px" src="https://www.primomedico.com/wp-content/uploads/2015/09/Prof-Dr-Schmidli-Juerg-Spezialist-Gefaesschirurgie-Bern-Portrait_klein.jpg">
            <p>Donec ullamcorper nulla non metus auctor fringilla. Vestibulum id ligula porta felis euismod semper.</p>
        </div>
    </section>
</div>

如果您只想插入新的&#39;记录到原始表中:

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