大家好我正在尝试创建一个查询来显示员工姓名和员工编号以及他们的超级名字和超级号码。上市还包括没有任何主管的员工。我为它写了一些代码,它给了我和错误,因为它不对。 有人愿意帮我一臂之力。干杯球员
SELECT employee.ename, employee.empno, boss.ename, boss.empno
FROM emp employee, emp boss
WHERE employee.super = boss.empno
OR employee.super AND boss.empno IS NULL;
提前致谢
-Jay
好吧我们找到了答案,我使用了外连接算子。左连接有效但在我们的课程中我们没有被教导。感谢那。使用外连接的答案如下:
SELECT employee.ename, employee.empno, boss.ename, boss.empno
FROM emp employee, emp boss
WHERE employee.super = boss.empno(+);
因此,它仍将返回employee.super为null的行。
答案 0 :(得分:4)
试试这个:
SELECT employee.ename, employee.empno, boss.ename, boss.empno
FROM emp employee
LEFT JOIN emp boss
ON employee.super = boss.empno
LEFT JOIN
表示即使右表(boss)中没有匹配的行,也会返回左表(employee)中的每一行。
答案 1 :(得分:1)
不要使用隐式SQL '89连接语法,这是一种反模式 离开侏罗纪公园并使用显式的SQL '92连接语法:
SELECT
employee.ename
, employee.empno
, boss.ename
, boss.empno
FROM emp employee
INNER JOIN emp boss on (employee.super <=> boss.empno)
您可以使用<=>
运算符:
null = null -> null -> no join
1 = 1 -> true -> join
1 = 0 -> false -> no join
null <=> null -> true -> join
1 <=> 1 -> true -> join
1 <=> 0 -> false -> no join
<=>
是特定于MySQL的,在您使用的MySQL之外:
(e.super = b.empno or (e.super is null and b.empno is null))
请注意,上面的连接与左连接不同:
//code from Mark Byers' answer
SELECT employee.ename, employee.empno, boss.ename, boss.empno
FROM emp employee
LEFT JOIN emp boss
ON employee.super = boss.empno
内连接产生的行数较少。
免责声明: 以下链接是一个快速而肮脏的连接可视化,可以用一粒盐。但它确实可以想象出一般的想法 请参阅:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
答案 2 :(得分:1)
您已使用employee.super
并尝试在以下位置评估为布尔值:
OR employee.super AND boss.empno IS NULL;
你需要将它与某些东西进行比较。
我会用:
SELECT employee.ename, employee.empno, boss.ename, boss.empno
FROM emp employee
LEFT JOIN emp boss ON employee.super = boss.empno
答案 3 :(得分:0)
使用:
SELECT employee.ename, employee.empno, boss.ename, boss.empno, CASE WHEN boss.empno IS NULL THEN 'no supervisor found'
ELSE 'supervisor found'
END
FROM employee LEFT JOIN emp boss ON boss.empno = employee.super
答案 4 :(得分:0)
SELECT employee.ename, employee.empno, boss.ename, boss.empno
FROM emp employee, emp boss
WHERE employee.super = boss.empno
UNION
SELECT employee.ename, employee.empno, '(no boss)', ('no boss')
FROM emp employee
WHERE employee.super IS NULL;