我有三张桌子emp, d1, d2
。表d1和d2具有几乎相同的结构。
我需要使用d1
或d2
加入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;
答案 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;
请注意,您的查询不会从d1
或d2
中选择任何内容。从这个意义上讲,根本不需要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
确保两者都选择相同数量和类型的列。