使用WHERE子句的SQL帮助。获取以下代码的错误

时间:2011-10-06 11:09:29

标签: mysql sql oracle-sqldeveloper

大家好我正在尝试创建一个查询来显示员工姓名和员工编号以及他们的超级名字和超级号码。上市还包括没有任何主管的员工。我为它写了一些代码,它给了我和错误,因为它不对。 有人愿意帮我一臂之力。干杯球员

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的行。

5 个答案:

答案 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;