SQL-запрос, возвращающий декартово произведение

У меня есть несколько таблиц:

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

(потом в отчете группирую по suc, потом dep, потом sec)

вместо этого я получил:

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

и так далее. Он приносит ВСЕ sucurs, ВСЕ depart, ВСЕ section и иногда дублирует emp.

Я что-то упускаю, но не знаю что. Любые подсказки?


person Juan Javaloyes    schedule 26.03.2012    source источник


Ответы (1)


Ну, вы всегда присоединяете таблицы только к employee — кажется, что Dep также связано с Suc — поэтому вам нужно второе условие JOIN (присоединяйтесь не только к id_dep, но и к id_suc!) . Для таблицы Sec требуется даже три условия JOIN, поскольку она имеет три общих идентификатора с таблицей Employee.

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
person marc_s    schedule 26.03.2012
comment
Это сделало это! Большое спасибо! Надеюсь, мне больше никогда не придется иметь дело с такими конструкциями :) - person Juan Javaloyes; 26.03.2012