SQL集运算符-从具有不同列的表中选择行
我使用的是Oracle10g,我试图使用set操作符从一个表中选择在查询的另一个表中没有出现的行 我正试图从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
员工
表中选择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列表。。(可能还有其他方法,但这是问题的答案)对不起,我已经发布了一个愚蠢的“答案”和三个愚蠢的“评论”,只是删除了它们。:-)我所有的错误