【问题标题】:Sybase, create a new table from a select statment from multiple tablesSybase,从多个表的select语句创建一个新表
【发布时间】:2013-03-07 06:11:47
【问题描述】:

我在 Sybase 中有两个表:

TABLE1:持有部门数据和部门关联的emp_id:

Dept_Id     Emp_id1   Emp_id2   Emp_id3
-------     -------   -------   -------
DEP1          11        22        33

TABLE2:持有与员工关联的 Emp_Id 和多个 Address_Id:

Emp_Id     Add_Id
------    --------
11         street1
11         street2
11         street3
22         mountRoad1
22         mountRoad2
33         PetersRoad

我想连接这两个表,并将以下结果插入到一个新表中:

Dept_Id   Emp_Id   Add_Id
-------   ------   ------
DEP1       11       street1
DEP1       11       street2
DEP1       11       street3
DEP1       22       mountRoad1
DEP1       22       mountRoad2
DEP1       33       PetersRoad

如何使用单个 SQL 查询来实现这一点?

【问题讨论】:

  • 员工 ID 作为列,真的吗?
  • PS 你的表结构很差 - 每个员工都有一个列,并且没有针对你的地址行的序列...
  • Tbale1 和 Table2 是现有表,我还没有创建它们。如上所述,我想在 Tbale 3 中插入​​记录。谢谢
  • 我尝试使用 UNION 及其作品,但我担心的是性能,Table1 和 Table2 有大量数据。那么实现这一目标的更好方法是什么??
  • table3 的创建是一次性的还是重复发生的?

标签: sql insert sybase union


【解决方案1】:

为什么不只使用 JOIN:

insert into table3 (Dep_id,Emp_id, Add_id)
select table1.Dep_id, table2.Emp_id, Table2.Add_id
from table1 
join table2 on table1.Emp_id1=table2.Emp_id or table1.Emp_id2=table2.Emp_id or table1.Emp_id3=table2.Emp_id

【讨论】:

    【解决方案2】:

    我认为你应该使用 UNION。例如:

    Insert into Table 3 (Dep_id,Emp_id, Add_id)
    select Dep_id,Emp_id1 as Emp_id, Table2.Add_id
    from Table 1 
    join Table2 on (Table1.Emp_id1=Table2.Emp_id)
    union all
    select Dep_id,Emp_id2 as Emp_id, Table2.Add_id
    from Table 1 
    join Table2 on (Table1.Emp_id2=Table2.Emp_id)
    union all
    select Dep_id,Emp_id3 as Emp_id, Table2.Add_id
    from Table 1 
    join Table2 on (Table1.Emp_id3=Table2.Emp_id)
    

    PS:如果需要添加 Emp_id4 怎么办????您的表结构未规范化。

    【讨论】:

    • 感谢 valex 的回复。一个部门最多只能关联三名员工。
    【解决方案3】:

    如果您对 table1 的愚蠢结构感到困惑,那么我可能会创建一个视图来人为地将结构更改为简单的部门员工表。像这样的:

    create view EmployeeDepartment
    as 
        select Dept_Id, Emp_id1 as Emp_id from Table1
        union select Dept_Id, Emp_id2 as Emp_id from Table1
        union select Dept_Id, Emp_id3 as Emp_id from Table1
    

    然后您可以根据需要使用此视图,例如选择部门/员工/地址

    select e.Dept_Id, e.Emp_Id, a.Add_Id
    from Table_2 a
    join EmployeeDepartment e on e.Emp_id = a.Emp_id
    

    或者建立你的第三张桌子

    insert into table3 (Dep_id, Emp_id, Add_id)
    select e.Dept_Id, e.Emp_Id, a.Add_Id
    from Table_2 a
    join EmployeeDepartment e on e.Emp_id = a.Emp_id
    

    另一方面,子查询视图也很容易选择来构建你的第三张表

    insert into table3 (Dep_id, Emp_id, Add_id)
    select e.Dept_Id, e.Emp_Id, a.Add_Id
    from Table_2 a
    join (
        select Dept_Id, Emp_id1 as Emp_id from Table1
        union select Dept_Id, Emp_id2 as Emp_id from Table1
        union select Dept_Id, Emp_id3 as Emp_id from Table1) e 
    on e.Emp_id = a.Emp_id
    

    当然,如果您有其他场景,该视图更可重用,如果您最终添加第四个员工 ID (emp_id4),则更易于维护。使用视图的其他查询不需要更改...

    【讨论】:

      猜你喜欢
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 2014-07-04
      • 2021-12-06
      相关资源
      最近更新 更多