【问题标题】:SQL query returning cartesian productSQL查询返回笛卡尔积
【发布时间】:2012-03-26 12:57:51
【问题描述】:

我有一些桌子:

员工:id、姓名、id_suc、id dep、id_sec 成功:id_suc,名称 部门:id_dep,id_suc,名称 秒:id_sec、id_dep、id_suc、名称

别怪我,这是一个现有的应用程序,我没有创建数据库,也无法触摸结构,因为里面的数据太多,并且依赖于它的报告。我只是想按要求修改报告。

我做一个查询:

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

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

【问题讨论】:

    标签: sql cartesian-product


    【解决方案1】:

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

    【讨论】:

    • 成功了!非常感谢你!希望我再也不用处理这种结构了:)
    猜你喜欢
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多