sql - 列出一名员工的所有列(dept、emp、salgrade)

标签 sql database oracle join select

我正在使用 ORACLE 的 Emp/Dept 数据库。如果有人不知道的话,这是结构:

 CREATE TABLE EMP
           (EMPNO NUMBER(4) NOT NULL,
            ENAME VARCHAR2(10),
            JOB VARCHAR2(9),
            MGR NUMBER(4),
            HIREDATE DATE,
            SAL NUMBER(7, 2),
            COMM NUMBER(7, 2),
            DEPTNO NUMBER(2));

    INSERT INTO EMP VALUES
            (7369, 'SMITH',  'CLERK',     7902,
            TO_DATE('17-MAR-1980', 'DD-MON-YYYY'),  800, NULL, 20);
    INSERT INTO EMP VALUES
            (7499, 'ALLEN',  'SALESMAN',  7698,
            TO_DATE('20-MAR-1981', 'DD-MON-YYYY'), 1600,  300, 30);
    INSERT INTO EMP VALUES
            (7521, 'WARD',   'SALESMAN',  7698,
            TO_DATE('22-MAR-1981', 'DD-MON-YYYY'), 1250,  500, 30);
    INSERT INTO EMP VALUES
            (7566, 'JONES',  'MANAGER',   7839,
            TO_DATE('2-MAR-1981', 'DD-MON-YYYY'),  2975, NULL, 20);
    INSERT INTO EMP VALUES
            (7654, 'MARTIN', 'SALESMAN',  7698,
            TO_DATE('28-MAR-1981', 'DD-MON-YYYY'), 1250, 1400, 30);
    INSERT INTO EMP VALUES
            (7698, 'BLAKE',  'MANAGER',   7839,
            TO_DATE('1-MAR-1981', 'DD-MON-YYYY'),  2850, NULL, 30);
    INSERT INTO EMP VALUES
            (7782, 'CLARK',  'MANAGER',   7839,
            TO_DATE('9-MAR-1981', 'DD-MON-YYYY'),  2450, NULL, 10);
    INSERT INTO EMP VALUES
            (7788, 'SCOTT',  'ANALYST',   7566,
            TO_DATE('09-MAR-1982', 'DD-MON-YYYY'), 3000, NULL, 20);
    INSERT INTO EMP VALUES
            (7839, 'KING',   'PRESIDENT', NULL,
            TO_DATE('17-MAR-1981', 'DD-MON-YYYY'), 5000, NULL, 10);
    INSERT INTO EMP VALUES
            (7844, 'TURNER', 'SALESMAN',  7698,
            TO_DATE('8-MAR-1981', 'DD-MON-YYYY'),  1500,    0, 30);
    INSERT INTO EMP VALUES
            (7876, 'ADAMS',  'CLERK',     7788,
            TO_DATE('12-MAR-1983', 'DD-MON-YYYY'), 1100, NULL, 20);
    INSERT INTO EMP VALUES
            (7900, 'JAMES',  'CLERK',     7698,
            TO_DATE('3-MAR-1981', 'DD-MON-YYYY'),   950, NULL, 30);
    INSERT INTO EMP VALUES
            (7902, 'FORD',   'ANALYST',   7566,
            TO_DATE('3-MAR-1981', 'DD-MON-YYYY'),  3000, NULL, 20);
    INSERT INTO EMP VALUES
            (7934, 'MILLER', 'CLERK',     7782,
            TO_DATE('23-MAR-1982', 'DD-MON-YYYY'), 1300, NULL, 10);

    CREATE TABLE DEPT
           (DEPTNO NUMBER(2),
            DNAME VARCHAR2(14),
            LOC VARCHAR2(13) );

    INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK');
    INSERT INTO DEPT VALUES (20, 'RESEARCH',   'DALLAS');
    INSERT INTO DEPT VALUES (30, 'SALES',      'CHICAGO');
    INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON');

    CREATE TABLE SALGRADE
            (GRADE NUMBER,
             LOSAL NUMBER,
             HISAL NUMBER);

    INSERT INTO SALGRADE VALUES (1,  700, 1200);
    INSERT INTO SALGRADE VALUES (2, 1201, 1400);
    INSERT INTO SALGRADE VALUES (3, 1401, 2000);
    INSERT INTO SALGRADE VALUES (4, 2001, 3000);
    INSERT INTO SALGRADE VALUES (5, 3001, 9999);

我需要在一个查询中列出一名员工(假设是 KING)的所有列。一切都会很容易,但有 Salgrade 表我不知道如何与其他表链接...... 我正在尝试类似的方法,但它不起作用......

SELECT e.Empno, e.Ename, e.Job, e.Mgr, e.Hiredate, e.Sal, e.Comm, e.Deptno, d.Dname, d.Loc, s.Grade
FROM Emp e, Salgrade s
INNER JOIN Dept d ON d.Deptno=e.Deptno
WHERE e.Ename = 'KING' AND e.Sal BETWEEN s.Losal AND s.Hisal

最佳答案

通过 Salgrade 上的不等式条件连接,您走在正确的轨道上。但是,您永远不应该混合隐式连接和显式连接。它们的评估顺序不同,因此这会导致难以调试的故障。您的查询产生错误:

ORA-00904: "E"."DEPTNO": invalid identifier

事实上,始终使用标准的显式连接(使用 on 关键字)。

这应该可以做到:

SELECT e.Empno, e.Ename, e.Job, e.Mgr, e.Hiredate, e.Sal, e.Comm, e.Deptno, d.Dname, d.Loc, s.Grade
FROM Emp e
INNER JOIN Dept d ON d.Deptno=e.Deptno
INNER JOIN Salgrade s ON e.Sal BETWEEN s.Losal AND s.Hisal
WHERE e.Ename = 'KING'

<强> Demo on DB Fiddle :

EMPNO | ENAME | JOB       |  MGR | HIREDATE  |  SAL | COMM | DEPTNO | DNAME      | LOC      | GRADE
----: | :---- | :-------- | ---: | :-------- | ---: | ---: | -----: | :--------- | :------- | ----:
 7839 | KING  | PRESIDENT | null | 17-MAR-81 | 5000 | null |     10 | ACCOUNTING | NEW YORK |     5

关于sql - 列出一名员工的所有列(dept、emp、salgrade),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61808589/

相关文章:

php - 选择具有三个级别的评论

mysql - 如果前一条记录具有按月份过滤的较低值,则选择一条记录

database - 如何使用 sqlite 配置 symfony2

mysql - Laravel 插入三向数据透视表

oracle - 在查询中查找绑定(bind)变量的安全方法是什么

sql - LISTAGG函数: "result of string concatenation is too long"

mysql - 在实现以下触发器 :- Subquery returns more than 1 row 后,我在invoice_line_item 中添加行时遇到错误

sql - 找出哪一列有特定的字符串并返回列号

database - 从 SQLite 移植到 Redis

Oracle 数据库 - 使用外部 Java