#sql #sql-server #sql-server-2005 #tsql
#sql #sql-сервер #sql-server-2005 #tsql
Вопрос:
У меня есть 2 таблицы: Сотрудник и Встречи.
У 1 сотрудника может быть назначено несколько встреч. Существует поле: Видимость, которое может содержать 0, 1 или 2.
0: show any of the appointment,
1: Show this appointment only,
2: Don't show the appointment.
Теперь я хочу выбрать записи о сотрудниках и встречах:
- если видимость равна 1, тогда выберите эту запись, а не какие-либо другие записи
- если видимость равна 0, тогда выберите просто запись, например, верхнюю 1
- если видимость равна 2, выберите значения null для этой записи, за исключением идентификатора сотрудника.
кто-нибудь может указать мне, как это можно сделать с помощью Sql Server 2000?
Комментарии:
1. 2000, как в тексте вопроса, или 2005, как в теге? Что, если у сотрудника назначены 2 встречи с
visibility
установленным флагом1
? TBH Я не совсем понимаю структуру, которая у вас есть.2. «как верхний 1» — что определяет верхний? самая ранняя или последняя по дате? тот, у которого наибольший идентификатор?
Ответ №1:
Я делаю пару предположений.
- Возможно назначить более одной встречи
- Если у вас назначены встречи с 1 и 0, вы хотите гарантировать, что будет показана встреча с 1
-
У вас может быть только одна запись с 1
SELECT e.empid, COALESCE(OneAppoint.appointmentID, ZeroAppoint.appointmentID) appointmentID FROM employee e LEFT JOIN appointment ZeroAppoint INNER JOIN ( SELECT max(a.appointmentid) appointmentid , a.EmpID FROM appointment a WHERE a.Visibility =0 ) maxZeroAppoint ON ZeroAppoint.appointmentid = maxZeroAppoint.appointmentid ON e.empID = ZeroAppoint.empID LEFT JOIN appointment OneAppoint ON e.empID = OneAppoint.empID and OneAppoint.Visibility = 1
Ответ №2:
With SelectedAppointments AS
{
SELECT * FROM Appointments WHERE Visibility <> 2
}
SELECT Employee.Id, < All columns of SelectedAppointments unless EmployeeId>
FROM Employee LEFT JOIN SelectedAppointments
on Employee.Id = SelectedAppointments.EmployeeId
Комментарии:
1. Хммм, извините, что я поместил тег на sql server 2005, в то время как в моем сообщении есть sql 2000. на самом деле это не имеет значения, потому что я хочу, чтобы это работало в обеих версиях. извините за ошибку. Мне нравятся эти ответы, особенно благодаря началу 1. Я забыл упомянуть одну вещь, и я полагаю, что у меня это получилось. Если у сотрудника уже назначена встреча с видимостью 1, она может отсутствовать в выборке, где у него назначена встреча 0 или 2.
2. У меня что-то работает: выберите max (a.id ), a.empid из назначения a, где a.видимость = 1 группа по объединению.empid выберите максимум (a.id ), a.empid из назначения a, где видимость = 0 и не существует (выберите * из назначения a1, где видимость = 1 и .empid = a1.empid) группируйте по.empid … он выбирает только те записи, которые видны, и те записи, которые не видны.
Ответ №3:
select *
from Employee as Emp
left outer join
(select top 1 *
from Appointments
where Visibility <> 2
order by Visibility desc) as App
on Emp.EmpID = App.EmpID