SQL 查询返回错误结果

Pur*_*ing 2 sql t-sql sql-server

对于大学作业,我们必须根据收到的问题编写一堆 SQL 查询,最后一个问题指出:

\n
\n

`编写一个查询,指示哪个员工已被医生 \xe2\x80\x98D0001\xe2\x80\x99 预订最多\n天数。显示员工姓名、\n医生姓名和天数

\n
\n

我的问题是,即使我说我想选择什么值,它也会返回错误的医生姓名,我无法理解为什么会发生这种情况。查询中的其他值按应有的方式显示,唯一的问题是 ID 中的医生姓名显示不正确

\n

桌子

\n
CREATE TABLE DOCTORS(\n    DOCTOR_ID VARCHAR(5) NOT NULL PRIMARY KEY,\n    DOCTOR_NAME VARCHAR(30) NOT NULL\n)\n
Run Code Online (Sandbox Code Playgroud)\n

我们必须添加的值

\n
INSERT INTO DOCTORS (DOCTOR_ID, DOCTOR_NAME) VALUES ('D0001', 'Thabo Ntlali')\nINSERT INTO DOCTORS (DOCTOR_ID, DOCTOR_NAME) VALUES ('D0002', 'Deon Coetzee')\nINSERT INTO DOCTORS (DOCTOR_ID, DOCTOR_NAME) VALUES ('D0003', 'Kwezi Mbete')\nINSERT INTO DOCTORS (DOCTOR_ID, DOCTOR_NAME) VALUES ('D0004', 'Trevor January')\nINSERT INTO DOCTORS (DOCTOR_ID, DOCTOR_NAME) VALUES ('D0005', 'Julia Robin')\n
Run Code Online (Sandbox Code Playgroud)\n

我写的查询

\n
SELECT TOP(1) emp.EMPLOYEE_NAME, emp.EMPLOYEE_SURNAME, d.DOCTOR_NAME, MAX(e.NUMBER_OF_DAYS) AS "NUMBER_OF_DAYS"\nFROM DOCTORS AS D, EMPLOYEES emp \nJOIN EMPLOYEE_SICKLEAVE e\nON emp.EMPLOYEE_ID = e.EMPLOYEE_ID\nWHERE e.DOCTOR_ID = 'D0001' \nGROUP BY emp.EMPLOYEE_NAME, emp.EMPLOYEE_SURNAME, d.DOCTOR_NAME\nORDER BY emp.EMPLOYEE_NAME, EMP.EMPLOYEE_SURNAME\n
Run Code Online (Sandbox Code Playgroud)\n

gve*_*vee 6

评论中非常重要的一点

今日提示:在任何地方都切换到现代、显式的 JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。

贾尔赫

那么让我们来看看你的加入:

...
FROM DOCTORS AS D, EMPLOYEES emp 
JOIN EMPLOYEE_SICKLEAVE e
ON emp.EMPLOYEE_ID = e.EMPLOYEE_ID
...
Run Code Online (Sandbox Code Playgroud)

这隐藏了这样一个事实:有 3 个表,但只有一个ON子句!

这可能是导致您的问题的原因。

因此,让我们[尽可能多地]重写它们:

...
FROM   DOCTORS
 INNER
  JOIN EMPLOYEES
    ON EMPLOYEES.<SOMETHING> = DOCTORS.<SOMETHING>
 INNER
  JOIN EMPLOYEE_SICKLEAVE
    ON EMPLOYEE_SICKLEAVE.EMPLOYEE_ID = EMPLOYEES.EMPLOYEE_ID
...
Run Code Online (Sandbox Code Playgroud)