2011-04-26 7 views
0

2 개의 테이블 인 Employee and Appointments가 있습니다.필드 값에 따라 행을 선택하십시오.

1 직원은 여러 개의 약속을 가질 수 있습니다. 필드가 : 0, 1 또는

0: show any of the appointment, 
    1: Show this appointment only, 
    2: Don't show the appointment. 

2. 지금은 직원의 기록과 약속을 선택합니다 저장할 수있는 가시성 :

  1. 이 경우 가시성을 한 후 그 기록을 선택하고
  2. 가시성이 0이면 상위 1과 같은 레코드 만 선택하십시오.
  3. 가시성이 2이면 직원 ID를 제외한 해당 레코드에 대해 null을 선택하십시오.

누구나 SQL Server 2000을 사용하여 어떻게 수행 할 수 있습니까?

+1

2000 질문 문안이나 2005와 같이 태그에? 직원이 'visibility' 플래그가'1 '로 설정된 2 개의 약속이있는 경우 어떻게됩니까? TBH 나는 너의 구조를 정말로 이해하지 못한다. –

+0

"톱 1과 비슷합니다"- 톱 정의는 무엇입니까? 가장 빠른 날짜 또는 최신 날짜? 가장 큰 이드를 가진 사람? –

답변

0

나는 가정의 부부를 만들고있어.

  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 
    
+0

이것은 매우 유용합니다. 고맙습니다. – Danny

0
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 
+0

흠, 죄송하지만 SQL Server 2005에 태그를 넣었습니다. 메시지에는 SQL 2000이 있습니다. 두 버전 모두에서 작업하기를 원하기 때문에별로 중요하지 않습니다. 사고로 유감이다. 나는이 답변을 특별히 1 번 꼭대기와 같이 좋아한다. 나는 한가지 언급하는 것을 잊어 버렸고 나는 그것이 작동한다고 믿는다. 직원이 visibility 1로 이미 약속을 가지고있는 경우, 약속이 0 또는 2 인 선택 영역에 아무 것도 없을 수 있습니다. – Danny

+0

나는 max (a.id)를 선택하고 약속에서 a.empid를 선택합니다. .visibility = 1 group by a.empid union select max (a.id), 약속에서 a.empid a 가시성 = 0이고 존재하지 않음 (약속 * a1에서 visibility = 1 및 a.empid = a1.empid에서 select * 선택) a.empid에 의해 그룹화한다. 그것은 볼 수있는 레코드들과 보이지 않는 레코드들만 선택한다. – Danny

0
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  
관련 문제