我将如何省略名称 jones 但显示具有相同 deptno 的人

Posted

技术标签:

【中文标题】我将如何省略名称 jones 但显示具有相同 deptno 的人【英文标题】:How would i leave out the name jones but display people with the same deptno 【发布时间】:2020-02-19 20:12:46 【问题描述】:
SQL> select empno, ename, deptno
  2  from empcopy
  3  where deptno =
  4      (select deptno
  5       from empcopy
  6       where ename like 'JONES');

 EMPNO ENAME          DEPTNO
------ ---------- ----------
  7369 SMITH              20
  7566 JONES              20
  7788 SCOTT              20
  7876 ADAMS              20
  7902 FORD               20

【问题讨论】:

7566 JONES 20 行应该被删除,不应该吗? 【参考方案1】:

你可以这样做:

select 
empno, ename, deptno
from empcopy 
where DEPTNO in (select DEPTNO  from empcopy where ename ='JONES')
and ename <>'JONES'

【讨论】:

【参考方案2】:

您只需在 where 子句中添加一个谓词即可排除 Jones。

SELECT
  empno,
  ename,
  deptno
  FROM
  empcopy
 WHERE
  deptno =(SELECT
             deptno
             FROM
             empcopy
            WHERE
             ename LIKE 'JONES'
          )
  AND ename != 'JONES';

【讨论】:

不等于是 或 != 在 SQL 中?【参考方案3】:

另一种选择:

SQL> with jones as
  2    (select ename, deptno
  3     from emp
  4     where ename = 'JONES'
  5    )
  6  select e.empno, e.ename, e.deptno
  7  from emp e join jones j on e.deptno = j.deptno and e.ename <> j.ename;

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      7369 SMITH              20
      7788 SCOTT              20
      7876 ADAMS              20
      7902 FORD               20

SQL>

【讨论】:

【参考方案4】:

另一个选项使用自连接,包括 ename 列的值的不等式:

select e1.empno, e1.ename, e1.deptno
  from employees e1
  join employees e2 
    on e1.deptno = e2.deptno
   and e2.ename = 'JONES'
   and e1.ename != e2.ename

Demo

【讨论】:

以上是关于我将如何省略名称 jones 但显示具有相同 deptno 的人的主要内容,如果未能解决你的问题,请参考以下文章

使用 SAX 解析器,如何解析具有相同名称标签但元素不同的 xml 文件?

如何反序列化具有相同名称但不同类型的 API 响应

postgresql 调用具有相同名称的列

如何使用多个目标使用具有相同名称的不同资产

如何在c#中使用具有相同名称但不同属性和结构的元素反序列化XML

如何从具有相同简单名称的类中查找某个方法?