#sql-server #query-performance
#sql-сервер #запрос-производительность
Вопрос:
Я хочу выбрать employeeID
из employee
сотрудников с минимальным временем простоя в таблице. Это простой запрос, но я в нем запутался. Я попробовал запрос, подобный этому:
SELECT dbo.tbSystemUser.EmployeeID,tbEmployee.Name
FROM dbo.tbSystemUser INNER JOIN
dbo.tbEmployee ON dbo.tbSystemUser.EmployeeID = dbo.tbEmployee.EmployeeID
WHERE (dbo.tbSystemUser.Time = MIN(dbo.tbSystemUser.Time))
Но это не работает. Time — это поле, в котором хранится время, имеющее тип данных time.
Комментарии:
1. Что-то вроде выбора первого по величине заказа идентификатора сотрудника по минимальному времени? Вам нужны связи, когда более 1 сотрудника имеют одинаковое минимальное время?
Ответ №1:
Что-то вроде:
SELECT tbl.*, tbEmployee.name
FROM (
SELECT tbSystemUser.employeeid, min(t) AS t
FROM tbSystemUser JOIN tbEmployee
ON tbSystemUser.employeeid = tbEmployee.employeeid
GROUP BY tbSystemUser.employeeid
) tbl, tbEmployee
WHERE tbl.employeeid = tbEmployee.employeeid
AND tbl.t = tbEmployee.t
Вот пример данных:
create table tbSystemUser (
employeeid varchar(10))
create table tbEmployee (
employeeid varchar(10),
name varchar(10),
t integer
)
insert into tbSystemUser values('a')
insert into tbSystemUser values('b')
insert into tbEmployee values('a', 'q', 1)
insert into tbEmployee values('a', 'w', 2)
insert into tbEmployee values('a', 'e', 3)
insert into tbEmployee values('b', 'z', 1)
insert into tbEmployee values('b', 'x', 2)
insert into tbEmployee values('b', 'c', 3)
Или еще проще:
SELECT tbl.*, tbEmployee.name
FROM (
SELECT employeeid, min(t) as t
FROM tbEmployee
GROUP BY employeeid) tbl, tbEmployee
WHERE tbl.employeeid = tbEmployee.employeeid
AND tbl.t = tbEmployee.t