我的数据库中有以下表格: 3 个主表、1 个明细表和 1 个用于“一对多”关系的表。
3个主表是:
员工:身份证,名字,姓氏
Positions: id, name, abbr
regions: id, name
和
r_employees_positions:id,employee_id,position_id。这是与“员工”和“职位”的“一对多”关系表:
明细表为:
Partners: id, partner_name, distributor_id, operator_id, position_id, region_id
我的目标是得到这样的数据集:
id, Partner_name, distributor, operator, region
“Employees”表在查询中有2个别名:“distr”和“oper”。 “distr”我用于获取分发合作伙伴订单的信息,“oper”用于获取有关订单准确性负责人的信息。
此选择语句返回空数据集:
Select
p.id, p.partner_name,
distr.first_name||' '||distr.Last_name as distibutor,
oper.first_name||' '||oper.Last_name as operator
from partners p, employees distr, employees oper, positions pos,
r_employees_positions ep
where
(p.partgrp_id=pg.partgrp_id) and
(p.distributor_id=distr.id and distr.id=ep.employee_id and
ep.position_id=pos.id) and
(p.operator_id=oper.id and oper.id=ep.employee_id and
ep.position_id=pos.id
解决方案:
我已经将 old_style sql-89 更改为 sql-92 样式并且语句正常工作。对风格的如此大的依赖令人惊讶。感谢所有建议我这样做的人。
select
p.id, p.partner_name,
distr.first_name||' '||distr.Last_name as distributor,
oper.first_name||' '||oper.Last_name as operator,
r.name as region,
pg.partgrp
from partn p
left join employees distr on p.distributor_id=distr.id
left join employees oper on p.operator_id=oper.id
left join r_employees_positions ep on distr.id=ep.employee_id and
oper.id=ep.employee_id
left join positions pos on ep.position_id=pos.id
left join regions r on p.region_id=r.id
left join partgrp pg on p.partgrp_id=pg.partgrp_id
order by p.id
你能试试这个吗:
Select
p.*,
pg.partgrp,
distr.first_name||' '||distr.Last_name as distibutor,
oper.first_name||' '||oper.Last_name as operator,
r.name as region
from partners p, partnersgroups pg, employees distr, employees oper, positions pos,
r_employees_positions ep
where
(p.partgrp_id=pg.partgrp_id) and
(
(p.position_id=distr.id and distr.id=ep.employee_id and ep.position_id=pos.id)
OR
(p.operator_id=oper.id and oper.id=ep.employee_id and ep.position_id=pos.id)
)