2016-08-01 56 views
2

我正在使用Oracle 10g,并试图从一个表中选择不使用set操作符在查询中出现在其他表中的行。SQL集合运算符 - 从具有不同列的表中选择行

我试图从这些行不出现在job_history表的employee表中选择idlast_namefirst_name列。

这两个表中唯一的共同列是id列。但我也想显示这些名字。

我曾尝试:

SELECT 
    id, last_name, first_name 
FROM 
    employees 

MINUS 

SELECT 
    id, TO_CHAR(null), TO_CHAR(null) 
FROM 
    job_history; 

不产生期望的结果。

但是,如果我不想从EMPLOYEE表中显示的名字,我用:

SELECT id FROM employees 
MINUS 
SELECT id FROM job_history; 

这给了我结果的一半,除了那我想从雇员表中的姓名。

有什么建议吗?

回答

2

您可以使用上的选择结果的内连接

select a.id, a.last_name, a.first_name 
from employees a 
inner join ( 
SELECT id FROM employees 
MINUS 
SELECT id FROM job_history) x on x.id = a.id 
+0

这为我产生了正确的结果。你能否提供一个关于'x on x.id = a.id'的解释?我从来没有遇到过这种语法。 – ethane

+0

是的..当然.. x是使用子查询创建的表的别名..并且x.id = a.id是表员工(别名a)和子查询表之间的连接子句.. hope很清楚..否则..再问我一次 – scaisEdge

+0

太棒了!清除它,谢谢。 – ethane

4

为什么你就不能使用NOT IN

SELECT id, last_name, first_name FROM employees 
WHERE ID NOT IN (SELECT id FROM job_history); 

你可以一试LEFT JOIN

SELECT e.id, e.last_name, e.first_name 
FROM employees e LEFT JOIN job_history jh 
ON e.ID = jh.ID 
WHERE jh.some_other_column IS NULL; 
+1

这似乎是最明智的答案。 –

+0

我知道有更简单的方法来产生结果,但我想了解如何使用集合运算符。 – ethane

+0

如果job_history.id列中存在NULL,NOT IN解决方案将产生错误的结果。这个列应该不是我们可以告诉的NULL,但应该首先检查。 – mathguy

相关问题