2015-10-07 212 views
-4

考虑一个Employee表2列SQL查询显示没有电话的所有员工的姓名?

ID是INT数据类型的

NAME是VARCHAR数据类型的。

考虑一个第二Employee_PHONE表2列

ID是INT数据类型的

PHONE是VARCHAR数据类型的。 两者都设置为NOT NULL。 EMPLOYEE_PHONE的

ID是外键它引用EMPLOYEE表

的主键的员工可能没有任何电话或可能有多个电话。 什么是SQL查询以显示没有电话的所有员工的姓名?

+0

什么数据库系统,您使用的? Oracle,SQL Server,Postgresql,MySQL? –

回答

0

这里有两个选择查询。

SELECT * FROM Employee a WHERE a.ID NOT IN (SELECT b.ID FROM Employee_PHONE) 

    SELECT * FROM Employee a 
    LEFT JOIN Employee_PHONE b ON a.ID = b.ID WHERE ISNULL(b.PHONE,'') = '' 
1

这可以直接从 “英语SQL” 被翻译

select e.* 
from employee e ---<<< get me all employees 
where not exists ---<<< that do not have a phone 
      (select * 
      from employee_phone ep 
      where ep.employee_id = e.id 
      and ep.phone <> ''); -- in case you allow empty strings in that column 
+0

它可以存在,但电话列是空白的。所以如果两个表中存在相同的ID,这个查询将不包括该空白电话号码。 – Japongskie

+0

@JapzDivino:好的列设置为“NOT NULL”,所以我假设“空字符串”也是无效的,但我已更新查询。 –

+1

@a_horse_with_no_name也许'ISNULL(ep.phone。'')<>'''会更好吗? –

0
select E.Name 
from Employee E left Join Employee_PHONE EP 
    on E.ID = EP.ID 
where EP.EMPLOYEE_PHONE is null or EP.EMPLOYEE_PHONE = '' 
+2

'INNER JOIN'将只显示员工的电话号码。 OP想要的是相反的。也许你正在寻找一种不同类型的“JOIN”。 –

+0

@RaduGheorghiu: - 谢谢指出。更新! –

0

试试这个:

select E.Name 
from Employee E left Join Employee_PHONE EP 
    on E.ID = EP.ID 
where EP.EMPLOYEE_PHONE is null 
相关问题