ID EMP_ID EMP_NAME
1 emp01 Sam
2 emp02 Jam
3 emp03 Mam
ID EMP_ID EMP_ADDRESS
1 1 A Street
2 1 B Street
3 2 Z Street
4 3 L Street
5 3 M Street
6 3 N Street
ID EMP_ID EMP_PHONE
1 1 123456789
2 1 456789123
3 3 456987321
4 3 465987321
5 3 321651213
如果我将输入作为'emp01'传递,我需要从父表和子表中获取所有信息
父表ID和子emp_id形成外键关系
如何实现这一目标?
答案 0 :(得分:2)
select p.ID,
p.Emp_ID,
p.Emp_Name,
c1.Emp_address,
c1.Emp_id,
c1.id,
c2.Emp_Phone,
c2.Emp_id,
c2.id
FROM
parent p
LEFT JOIN child1 c1 ON c1.id = p.id
LEFT JOIN child2 c2 ON c2.id = p.id
WHERE p.Emp_ID ='emp01';
****编辑**
select p.ID,
GROUP_CONCAT(c2.Emp_Phone)
FROM
parent p
LEFT JOIN child1 c1 ON c1.id = p.id
LEFT JOIN child2 c2 ON c2.id = p.id
WHERE p.Emp_ID ='emp01'
GROUP BY p.Emp_ID;
答案 1 :(得分:1)
通常:
select f1,f2,f3 from t1,t2,t3 where t1.x = t2.y and t1.x = t3.y
答案 2 :(得分:1)
是的,但你会根据子表中的多个条目获得重复信息(通过笛卡尔结果)
select a1.ID,
a1.Emp_ID,
a1.Emp_Name,
b1.Emp_Address,
b1.Emp_Phone
from
EmployeeTable a1,
AddressTable b1,
PhoneTable c1
where
a1.Emp_ID = {your parameter ID value}
and a1.ID = b1.Emp_ID
and a1.ID = c1.Emp_ID;
因此,如果一名员工拥有2条地址线和2个电话号码,则会在查询中返回4行...
ID 1,地址1,电话1 ID 1,地址1,电话2 ID 1,地址2,电话1 ID 1,地址2,电话2
答案 3 :(得分:0)
有两种方法可以做到这一点:
select emp_name, emp_address, emp_phone
from t1, t2, t3
where t1.id = t2.emp_id and
t1.id = t3.emp_id;
或
select emp_name, emp_address, emp_phone
from t1
join t2 on (t2.emp_id = t1.id)
join t3 on (t3.emp_id = t1.id);
它们都是相同的优化,所以除了第二种形式也适用于左连接之类的东西之外,没有任何理由可以优先选择其他形式。
但请参阅@Drapp对笛卡尔联合的谨慎态度。将地址和电话号码放在单独的表中的全部原因是,您可以为单个员工提供多个地址和电话号码,这样做会产生多种结果。