【问题标题】:SQL Set Operators - Selecting rows from tables with different columnsSQL 集合运算符 - 从具有不同列的表中选择行
【发布时间】:2016-08-01 20:15:48
【问题描述】:

我正在使用 Oracle 10g,我正在尝试使用集合运算符从一个表中选择未出现在查询中的另一个表中的行。

我正在尝试从employee 表中选择idlast_namefirst_name 列,其中这些行没有出现在job_history 表中。

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

我试过了:

SELECT 
    id, last_name, first_name 
FROM 
    employees

MINUS

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

这不会产生预期的结果。

但是,如果我不想显示员工表中的姓名,我会使用:

SELECT id FROM employees
MINUS
SELECT id FROM job_history;

这给了我一半的结果,除了我想要员工表中的名字。

有什么建议吗?

【问题讨论】:

    标签: sql oracle oracle10g set-operations


    【解决方案1】:

    你为什么不能像NOT IN一样使用

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

    你也可以试试LEFT JOINlike

    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;
    

    【讨论】:

    • 这似乎是最明智的答案。
    • 我知道有更简单的方法可以产生结果,但我正在尝试了解如何使用集合运算符。
    • 如果 job_history.id 列中有 NULL,NOT IN 解决方案将产生错误的结果。据我们所知,此列不应为 NULL,但应首先检查。
    • @mathguy,因为它是一个 ID 列并且将具有 NOT NULL 约束。
    • 我同意并且我的建议相同,但先检查一下也无妨。您确定此列有NOT NULL 约束吗?它不应该意味着它有! :-)
    【解决方案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
    

    【讨论】:

    • 这为我产生了正确的结果。你能解释一下x on x.id = a.id吗?我从来没有遇到过这种语法。
    • 是的.. 当然.. x 是使用 subselect 创建的表的别名 .. 并且 x.id = a.id 是表员工之间的连接子句(别名 a)和子选择表..希望很清楚..否则..再问我一次
    • 不知道为什么这里需要minus。 (当然,没有它的解决方案不使用集合操作,但这个解决方案中使用的minus 是不必要的。)
    • @mathguy OP 使用减号获取不在 job_history 中的员工的 id 列表......(可能还有其他方式,但这是来自问题的原因)
    • 对不起,我已经发布了一个愚蠢的“答案”和三个愚蠢的“cmets”,只是删除了它们。 :-) 我所有的错误
    猜你喜欢
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多