Pur*_*ing 2 sql t-sql sql-server
对于大学作业,我们必须根据收到的问题编写一堆 SQL 查询,最后一个问题指出:
\n\n\n`编写一个查询,指示哪个员工已被医生 \xe2\x80\x98D0001\xe2\x80\x99 预订最多\n天数。显示员工姓名、\n医生姓名和天数
\n
我的问题是,即使我说我想选择什么值,它也会返回错误的医生姓名,我无法理解为什么会发生这种情况。查询中的其他值按应有的方式显示,唯一的问题是 ID 中的医生姓名显示不正确
\n桌子
\nCREATE TABLE DOCTORS(\n DOCTOR_ID VARCHAR(5) NOT NULL PRIMARY KEY,\n DOCTOR_NAME VARCHAR(30) NOT NULL\n)\nRun Code Online (Sandbox Code Playgroud)\n我们必须添加的值
\nINSERT 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')\nRun Code Online (Sandbox Code Playgroud)\n我写的查询
\nSELECT 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\nRun Code Online (Sandbox Code Playgroud)\n
评论中非常重要的一点
今日提示:在任何地方都切换到现代、显式的 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)