SQL-запрос, возвращающий декартово произведение - PullRequest
3 голосов
/ 26 марта 2012

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

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.

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

1 Ответ

5 голосов
/ 26 марта 2012

Ну, вы всегда присоединяете таблицы только к 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...