Операторы mySQL JOIN не возвращают то, что я хотел - PullRequest
2 голосов
/ 14 ноября 2010

Я хочу отобразить «FULL JOIN» из двух таблиц, но для создания совпадений используется посредник с внешними ключами.

Это должно показать список всех сотрудников с проектами, над которыми они работают, и список всех сотрудников без проектов или проектов без сотрудников.

Проблема с этим запросом заключается в том, что второй «RIGHT JOIN» перекрывает первый «LEFT JOIN». Все мои попытки «FULL JOIN» во второй раз потерпели неудачу. (Синтаксическая ошибка 1064, реальная описательная)

SELECT EMP_LNAME, EMP_FNAME, Project.PROJ_NAME
FROM Employee1
LEFT JOIN Assignment ON Employee1.EMP_CODE = Assignment.EMP_CODE
FULL JOIN Project ON Assignment.PROJ_CODE = Project.PROJ_CODE
ORDER BY Employee1.EMP_LNAME /* Syntax error */

Второй тип, который я пробовал

SELECT EMP_LNAME, EMP_FNAME, Project.PROJ_NAME
FROM Employee1
LEFT JOIN Assignment ON Employee1.EMP_CODE = Assignment.EMP_CODE
RIGHT JOIN Project ON Assignment.PROJ_CODE = Project.PROJ_CODE
ORDER BY Employee1.EMP_LNAME /* Right join overwrites original left join */

Ответы [ 2 ]

3 голосов
/ 14 ноября 2010

Чтобы получить ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ в MySQL, необходимо сначала выполнить ЛЕВОЕ СОЕДИНЕНИЕ, а затем ПРАВОЕ СОЕДИНЕНИЕ и ОБЪЕДИНИТЬ ВСЕ результаты (или вместо ПРАВОГО СОЕДИНЕНИЯ перевернуть таблицы и использовать другое ЛЕВОЕ СОЕДИНЕНИЕ). Но одна вещь, о которой следует быть осторожным, заключается в том, что во втором соединении вам нужно отбросить строки, для которых соединение выполнено успешно, чтобы вы не получили дубликатов в результате.

SELECT EMP_LNAME, EMP_FNAME, Project.PROJ_NAME
FROM Employee1
LEFT JOIN Assignment ON Employee1.EMP_CODE = Assignment.EMP_CODE
LEFT JOIN Project ON Assignment.PROJ_CODE = Project.PROJ_CODE
UNION ALL
SELECT EMP_LNAME, EMP_FNAME, Project.PROJ_NAME
FROM Project
LEFT JOIN Assignment ON Assignment.PROJ_CODE = Project.PROJ_CODE
LEFT JOIN Employee1 ON Employee1.EMP_CODE = Assignment.EMP_CODE
WHERE Employee1.ID IS NULL
ORDER BY EMP_LNAME

Я предполагаю, что в вашей таблице Employee1 есть идентификатор вызова поля, который не может быть пустым.

2 голосов
/ 14 ноября 2010

MySQL не поддерживает "FULL" в своем синтаксисе JOIN , то, что вы ищете, называется FULL OUTER JOIN .

Это один из способов получить желаемый результат :

    SELECT e.emp_lname,
           e.emp_fname,
           p.project_name
      FROM EMPLOYEE e
 LEFT JOIN ASSIGNMENT a ON a.emp_code = e.emp_code
      JOIN PROJECT p ON p.proj_code = a.proj_code
UNION
   SELECT e.emp_lname,
           e.emp_fname,
           p.project_name
      FROM EMPLOYEE e
RIGHT JOIN ASSIGNMENT a ON a.emp_code = e.emp_code
      JOIN PROJECT p ON p.proj_code = a.proj_code
ORDER BY emp_lname
...