Выбор строк в зависимости от значения поля

#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. если видимость равна 1, тогда выберите эту запись, а не какие-либо другие записи
  2. если видимость равна 0, тогда выберите просто запись, например, верхнюю 1
  3. если видимость равна 2, выберите значения null для этой записи, за исключением идентификатора сотрудника.

кто-нибудь может указать мне, как это можно сделать с помощью Sql Server 2000?

Комментарии:

1. 2000, как в тексте вопроса, или 2005, как в теге? Что, если у сотрудника назначены 2 встречи с visibility установленным флагом 1 ? TBH Я не совсем понимаю структуру, которая у вас есть.

2. «как верхний 1» — что определяет верхний? самая ранняя или последняя по дате? тот, у которого наибольший идентификатор?

Ответ №1:

Я делаю пару предположений.

  1. Возможно назначить более одной встречи
  2. Если у вас назначены встречи с 1 и 0, вы хотите гарантировать, что будет показана встреча с 1
  3. У вас может быть только одна запись с 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