条件连接以确定连接表

时间:2018-05-28 10:53:21

标签: mysql sql

我有三张桌子emp, d1, d2。表d1和d2具有几乎相同的结构。 我需要使用d1d2加入emp表,具体取决于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 :(得分:2)

没有“条件”加入这样的东西。你可以这样做:

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;

请注意,您的查询不会从d1d2中选择任何内容。从这个意义上讲,根本不需要JOIN。请注意SELECT中用于从列中获取值的逻辑。

如果您使用联接进行过滤,请添加:

WHERE d2.deptno IS NOT NULL OR d1.deptno IS NOT NULL.

答案 1 :(得分:1)

这是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

确保两者都选择相同数量和类型的列。