2011-04-26 121 views
0

選擇行我有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,則爲該記錄選擇空值,除了員工ID。

任何人都可以點我如何可以使用SQL Server 2000做什麼?

+1

2000如問題文本或2005中的標記?如果員工有兩個預約'visibility'標誌設置爲'1'? TBH我不太瞭解你的結構。 – 2011-04-26 11:12:25

+0

「像頂部1」 - 什麼定義頂部?最早的還是最近的一個日期?一個最大的ID? – 2011-04-26 11:12:57

回答

0

我做了幾個假設。

  1. 它可能有一個以上的預約
  2. 如果你有1,您想保證一個具有1所示
  3. 0的約會只能有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 2011-04-27 10:12:36

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

Hmmmm對不起,我把在SQL Server 2005中的標籤,而我在消息有SQL 2000。並不重要,因爲我希望它可以在兩個版本上工作。對於這次事故抱歉。我喜歡這些答案,特別感謝頂部1.我忘了提及一件事,我相信我得到了它的工作。如果員工已經有一個約會,能見度1,則可能不會在他有一個約會的選擇存在0或2 – Danny 2011-04-26 12:43:37

+0

我得到的東西的工作:從約會選擇MAX(a.id),a.empid其中一個.visibility = 1組由a.empid UNION SELECT MAX(a.id),從那裏的可視性= 0並且不存在預約一個a.empid(SELECT * FROM預約A1其中能見度= 1和a.empid = a1.empid) group by a.empid ...它只會選擇那些可見的記錄和那些不可見的記錄。 – Danny 2011-04-26 12:57:29

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