Sql server SQL Server:用于选择没有挂起作业状态的员工的查询
我们有三张表:员工、工作和工作历史 在这里,我们需要选择没有任何状态为“待定”的工作的员工姓名和最新完成时间 雇员Sql server SQL Server:用于选择没有挂起作业状态的员工的查询,sql-server,Sql Server,我们有三张表:员工、工作和工作历史 在这里,我们需要选择没有任何状态为“待定”的工作的员工姓名和最新完成时间 雇员 | Employee Name | Job Name | +---------------+----------+ | Jane | job1 | | Jane | job2 | | Jane | job3 | | Alex | job4 | | Alex |
| Employee Name | Job Name |
+---------------+----------+
| Jane | job1 |
| Jane | job2 |
| Jane | job3 |
| Alex | job4 |
| Alex | job5 |
| John | job6 |
工作
工作经历
| Job Name | Completion time |
+----------+---------------------+
| job1 | 2019-08-27 04:50:25 |
| job2 | 2019-08-30 17:45:34 |
| job3 | 2019-09-12 09:53:20 |
| job4 | 2019-08-27 04:50:25 |
| job5 | 2019-09-07 20:57:25 |
| job6 | 2019-10-30 07:45:34 |
预期结果
| Alex | 2019-09-07 20:57:25 |
| John | 2019-10-30 07:45:34 |
我的问题是:
选择
e、 员工姓名,h.完成时间
从…起
雇员
左外连接
b上的作业b。作业名称=e.作业名称和b.状态未处于“待定”状态
左外连接
作业历史记录h ON h.作业名称=e.作业名称
和h.完成时间=选择前1个h.完成时间
按h.完成时间说明订购
MS SQL Server 2017架构设置:
问题1:
这看起来像是一个规范,而不是一个问题——您已经尝试过解决这个问题了吗?它看起来像是一个带有一些连接的非常简单的SQL查询。欢迎使用堆栈溢出!你似乎在要求这个社区为你做家庭作业。我们不是这样做的。若要了解更多有关此社区的信息以及我们如何帮助您,请从和阅读及其链接的资源开始。您的目标是什么,技术负责人?似乎您需要使用max或某些窗口功能(如row_number)从项目中获取最新的日期时间值。如果希望看到完成日期,则使用外部联接没有什么意义。一个历史表每个项目有一行,这有点奇怪-你把它简化了吗?还是你给那张桌子起错名字了?如果某个员工没有工作,该员工是否会出现在您的结果中。
| Alex | 2019-09-07 20:57:25 |
| John | 2019-10-30 07:45:34 |
CREATE TABLE Employees(EmployeeName varchar(20),JobName varchar(20))
CREATE TABLE [Job] (JobName varchar(20), [Status] varchar(20))
CREATE TABLE JobHistory(JobName varchar(20), CompletionTime Date)
INSERT INTO Employees (EmployeeName,JobName) VALUES ('Jane','job1'),('Jane','job2')
,('Jane','job3'),('Alex','job4'),('Alex','job5'),('John','job6')
INSERT INTO [Job](JobName,[Status]) VALUES ('job1','Completed'),('job2','Pending')
,('job3','Completed'),('job4','Completed'),('job5','Completed'),('job6','Completed')
INSERT INTO JobHistory(JobName,CompletionTime) VALUES ('job1','2019-08-27'),
('job2','2019-08-30'),('job3','2019-09-12'),('job4','2019-08-27'),
('job5','2019-09-07'),('job6','2019-10-30')
WITH CTE AS (
SELECT E.EmployeeName,MAX(J.[Status]) AS [Status] ,MAX(H.CompletionTime) AS CompletionTime FROM Employees AS E
LEFT JOIN [Job] AS J ON E.JobName = J.JobName
LEFT JOIN JobHistory AS H ON H.JobName=J.JobName
GROUP BY E.EmployeeName)
SELECT C.* FROM CTE AS C
INNER JOIN
(SELECT EmployeeName
FROM Employees AS E
INNER JOIN Job AS J ON E.JobName=J.JobName
WHERE [Status] = 'Pending') AS T ON T.EmployeeName <> C.EmployeeName
| EmployeeName | Status | CompletionTime |
|--------------|-----------|----------------|
| Alex | Completed | 2019-09-07 |
| John | Completed | 2019-10-30 |