我正在使用 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/