SQL查询返回笛卡尔积

4

我有一些表格:

员工:编号、姓名、上级编号、部门编号、小组编号
上级:编号、名称
部门:编号、上级编号、名称
小组:编号、部门编号、上级编号、名称

别怪我,这是一个现有的应用程序,我没有创建数据库,也不能修改结构,因为里面有太多的数据和报告依赖它。我只是按照要求尝试修改报告。

我进行了一次查询:

SELECT DISTINCT 
  s.name as sucurs, 
  d.name as depart, 
  c.name as section, 
  e.name AS emp 
FROM 
  employee e 
  join suc s on (e.id_suc = s.id_suc) 
  join dep d on (e.id_dep = d.id_dep) 
  join sec c on (e.id_sec = c.id_sec) 
ORDER BY 
  sucurs, depart, section, emp

并给我带来了一个笛卡尔积。我希望:
sucurs1, depart1, section1, emp1
sucurs1, depart1, section1, emp2
.....

(然后在报告中,我按照suc、dep和sec进行分组)

但实际上,我得到的结果是:

sucurs1, depart1, section1, emp1
sucurs2, depart1, section1, emp1

等等。它带来了所有的sucurs,所有的depart,所有的section和有时重复的emp

我似乎漏掉了某些东西,但不知道是什么。有任何线索吗?

1个回答

6

好的,您总是只将表连接到 employee - 看起来 Dep 也与 Suc 相关联 - 因此您需要第二个 JOIN 条件(不仅在 id_dep 上加入,还要在 id_suc 上加入!)。表格 Sec 甚至需要 三个 JOIN 条件,因为它与 Employee 表共享三个 id。

SELECT DISTINCT 
  s.name as sucurs, 
  d.name as depart, 
  c.name as section, 
  e.name AS emp 
FROM 
  employee e 
INNER JOIN 
  suc s ON e.id_suc = s.id_suc
INNER JOIN 
  dep d ON e.id_dep = d.id_dep AND e.id_suc = d.id_suc
INNER JOIN 
  sec c ON e.id_sec = c.id_sec AND e.id_suc = c.id_suc AND e.id_dep = c.id_dep
ORDER BY 
  sucurs, depart, section, emp

1
成功了!非常感谢!希望我再也不必处理这种类型的结构了 :) - Juan Javaloyes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接