SQL查询返回笛卡尔积

时间:2012-03-26 12:57:51

标签: sql cartesian-product

我有一些表格:

Employee: id, name, id_suc, id dep, id_sec
Suc     : id_suc, name
Dep     : id_dep, id_suc, name
Sec     : id_sec, id_dep, id_suc, name

不要责怪我,这是一个现有的应用程序,我没有创建数据库,因为里面的数据太多而报告依赖于它,所以无法触及结构。我只是想按照要求修改报告。

我查询:

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
.....

(然后在报告中我按成功分组,然后是dep,然后是秒)

相反,我得到了:

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

等等。它会带来所有sucurs,所有depart,所有section,有时会重复emp

我错过了什么,但不知道是什么。有线索吗?

1 个答案:

答案 0 :(得分:5)

好吧,你总是加入表格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