Условное объединение для определения таблицы присоединения - PullRequest
0 голосов
/ 28 мая 2018

У меня три таблицы emp, d1, d2.Таблицы d1 и d2 имеют почти одинаковую структуру.Мне нужно объединить таблицу emp с d1 или d2 в зависимости от значения столбца deptno в таблице emp.Мой запрос, который я написал, не работает и выдает синтаксическую ошибку:

Код ошибки: 1064 В синтаксисе SQL есть ошибка;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'CASE

SELECT
  e.`empno`,
  e.`ename`,
  e.`job`,
  e.`mgr`,
  e.`hiredate`,
  e.`sal`,
  e.`comm`,
  e.`deptno`
FROM
  `emp` e
  JOIN
  CASE
    WHEN e.deptno <= 20
    THEN
     d1 ON e.deptno = d1.`deptno`
    ELSE
     d2 ON e.deptno = d2.`deptno`
    END;

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Вот для чего используется UNION SELECT:

SELECT e.`empno`, e.`deptno` 
FROM `emp` e JOIN d1 ON e.deptno = d1.`deptno`
WHERE e.deptno <= 20
UNION
SELECT e.`empno`, e.`deptno` 
FROM `emp` e JOIN d2 ON e.deptno = d2.`deptno` 
WHERE e.deptno > 20

Просто убедитесь, что оба параметра выбирают одинаковое количество и тип столбцов.

0 голосов
/ 28 мая 2018

Не существует такого понятия, как «условное» объединение.Вы можете сделать:

SELECT e.*,
       COALESCE(d1.col1, d2.col1) as col1
FROM emp e LEFT JOIN
     d1
     ON e.deptno = d1.deptno AND e.deptno <= 20 LEFT JOIN
     d2
     ON e.deptno = d2.deptno AND e.deptno > 20;

Обратите внимание, что ваш запрос не выбирает ничего из d1 или d2.В этом смысле JOIN совсем не нужен.Обратите внимание на логику в SELECT для получения значений из столбцов.

Если вы используете объединения для фильтрации, добавьте:

WHERE d2.deptno IS NOT NULL OR d1.deptno IS NOT NULL.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...