【问题标题】:Duplicating multiple records in table with primary key使用主键复制表中的多条记录
【发布时间】:2016-05-05 21:00:36
【问题描述】:

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

考虑表 employee 与列 (eid(primary key),ename,dept,dept_code)。

表 2 employee_address 包含列(eaid(主键)、eid(外键)、城市、国家/地区)

现在的任务是表 1(即员工)可能有多个具有不同部门代码的值。

假设dept_code可能是1或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

员工地址

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

现在的问题是我必须复制员工表中的所有记录,其中 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**

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

这个任务的条件是,

  • 没有for循环
  • 应尽可能少地访问数据库
  • 可以使用 java 或 sql 查询本身。

我尝试了各种想法,但都没有成功。

帮我解决这个问题。

【问题讨论】:

  • 这与 java 有什么关系?
  • I tried with various ideas nothing worked out 请展示或解释您的尝试。
  • 我将从 select into 和一个子查询开始。唯一棘手的部分是使用正确的主键。喜欢:select (select max(eid) + 1 from employee ), ename, dept, 5 into employee from (select * from employee where dept_code = 1)

标签: sql oracle arraylist duplicates


【解决方案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

【讨论】:

  • 谢谢!它的工作。还有一件事情。我想插入这是数据库。您只是在选择事物并显示。
  • 您好,这是我实际的第二个查询。
  • select A.* from t017_fournisseur_inconnu T Join t0171_fournisseur_inconnu_lig A on A.cap_rnpo_id = T.cap_rnpo_id Union All select A.cap_rnpo_lig_id + (select max(cap_rnpo_lig_id) from t0171_fournisseur_inconnu_lig), Dense_Rank() over T.cap_rnpo_id) + (select max(cap_rnpo_id) from t017_fournisseur_inconnu), cd_site, prorata, compte, libelle, ville, pays, codepays, client_scopp, cli_fin, cc, oa, pa, ca, decision, origine, dateupdate, ipn from t017_fournisseur_inconnu T 在 A.cap_rnpo_id = T.cap_rnpo_id 上加入 t0171_fournisseur_inconnu_lig A,其中 T.scenario_id=1;
  • 我收到类似这样的错误 ORA-00918: column ambiguously defined 00918. 00000 - "column ambiguously defined" *原因: *Action: Error at Line: 20 Column: 57. 我认为这是由于表2结构..因为该表中的主键位于第二列。纠正其中的错误。
  • 如果没有表的数据和结构,我无法重新创建错误。模糊定义通常是指在选择列表中有一个列名,该列名存在于两个连接但没有别名前缀的表中。例如,eid 需要是 E.eid 或 A.eid。至于将数据插入主键的问题,您可能需要设置身份插入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 2020-09-12
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多