我在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查询实现此目的?
答案 0 :(得分:3)
为什么不仅使用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
答案 1 :(得分:0)
我认为你应该使用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怎么办?您的表结构未规范化。
答案 2 :(得分:0)
如果你坚持使用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
或者建立你的第3张桌子
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
另一方面,它同样容易查询视图选择来构建你的第3个表
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
当然,如果您有其他方案并且最终添加第4个员工ID(emp_id4)时更容易维护,则视图更可重用。使用该视图的其他查询不需要更改...