具有 2 个别名的 Firebird 查询返回空数据集

问题描述 投票:0回答:1

我的数据库中有以下表格: 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
sql firebird
1个回答
-1
投票

你能试试这个吗:

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)
 )
© www.soinside.com 2019 - 2024. All rights reserved.