Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL集运算符-从具有不同列的表中选择行_Sql_Oracle_Oracle10g_Set Operations - Fatal编程技术网

SQL集运算符-从具有不同列的表中选择行

SQL集运算符-从具有不同列的表中选择行,sql,oracle,oracle10g,set-operations,Sql,Oracle,Oracle10g,Set Operations,我使用的是Oracle10g,我试图使用set操作符从一个表中选择在查询的另一个表中没有出现的行 我正试图从员工表中选择id、姓氏和名字列,这些行不会出现在工作历史表中 这两个表中唯一常见的列是id列。但是我也想显示这些名字 我试过: SELECT id, last_name, first_name FROM employees MINUS SELECT id, TO_CHAR(null), TO_CHAR(null) FROM job_histo

我使用的是Oracle10g,我试图使用set操作符从一个表中选择在查询的另一个表中没有出现的行

我正试图从
员工
表中选择
id
姓氏
名字
列,这些行不会出现在
工作历史
表中

这两个表中唯一常见的列是
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;
这给了我一半的结果,除了我想要employee表中的名字


有什么建议吗?

你为什么不能像这样使用
而不是

SELECT id, last_name, first_name FROM employees
WHERE ID NOT IN (SELECT id FROM job_history);
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;
您也可以尝试像这样使用
LEFT JOIN

SELECT id, last_name, first_name FROM employees
WHERE ID NOT IN (SELECT id FROM job_history);
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;

可以在选择结果上使用内部联接

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

这似乎是最明智的答案。我知道有更简单的方法生成结果,但我正在尝试了解如何使用集合运算符。如果job_history.id列中有空值,则NOT IN解决方案将生成错误的结果。根据我们的判断,此列不应为空,但应首先检查。@mathguy,因为它是一个ID列,并且将具有
不为空
约束。我同意,我也建议这样做,但首先检查不会有任何伤害。您是否确定此列具有
NOTNULL
约束?它不应该意味着它有!:-)这对我来说是正确的结果。你能解释一下x.id=a.id上的
x吗?我从来没有遇到过这种语法。是的。。当然x是使用子选择创建的表的别名。。在x.id=a.id上,是表employees(别名a)和子select表之间的join子句。。希望是明确的。。否则。。再问我一次,我不知道为什么这里需要
减号。(当然,如果没有它,解决方案不会使用set操作,但此解决方案中使用的
减号是不必要的。)@mathguy OP使用减号来获取不在工作历史记录中的员工id列表。。(可能还有其他方法,但这是问题的答案)对不起,我已经发布了一个愚蠢的“答案”和三个愚蠢的“评论”,只是删除了它们。:-)我所有的错误