2015-05-10 23 views
0

我有一個INSERT SQL查詢,需要檢查該條目是否會導致重複預訂,並且該2個用戶(醫生和患者)與同一診所。 (發現更容易在考慮到情況說明),在SQL我是:不存在檢查並等於「=」檢查一起失敗,但獨立工作

WITH ins (MedStaffID, PatientID, TimeSlot, AppDate) 
    AS (SELECT 1, 6, 10, DATEADD(day, 1, CAST(GETDATE() AS DATE))) 
INSERT INTO Appointments (MedStaffID, PatientID, TimeSlot, AppDate) 
SELECT ins.MedStaffID, ins.PatientID, ins.TimeSlot, ins.AppDate 
FROM ins 
WHERE 
NOT EXISTS 
(
    SELECT * 
    FROM Appointments 
    WHERE (MedStaffID = ins.MedStaffID OR PatientID = ins.PatientID) 
    AND TimeSlot = TimeSlot 
    AND AppDate = ins.AppDate 
) 
AND 
(
    SELECT Clinic 
    FROM Users UD 
    WHERE UD.ID = ins.MedStaffID 
) 
= 
(
    SELECT Clinic 
    FROM Users UD 
    WHERE UD.ID = ins.PatientID 
); 

的2 WHERE檢查正常工作,沒有其他,但即使它應該在一起時,總是導致INSERT不會繼續通過兩項檢查。

例用戶表:

ID Clinic Role Forename n'otherstuff 
1  1  Doctor  Bob   Potato 
2  1  Patient Jim   Cake 
3  1  Patient Laura   Tart 
4  2  Doctor Sally  Muffin 
5  2  Patient Khaaan  Lolly 

實例約會表:

ID MedStaffID PatientID TimeSlot Date 
1  1    2   1  *today 
2  1    2   2  *today 
3  1    3   4  *today 
4  4    5   2  *today 

所以插入需要防止另一個預約醫生,如果他已經有那個時間和日期的預約,也對於病人。

它還需要確保醫生和患者與同一診所。

個別檢查是做他們的工作,但我需要他們一起工作,還需要另一次檢查以確保放置在「MedStaffID」字段中的ID與具有「Role」「Doctor」的用戶綁定,但現在我被困在這兩次檢查中。

回答

1

也許你只是想直接加入?

WITH ins (MedStaffID, PatientID, TimeSlot, AppDate) 
    AS (SELECT 1, 6, 10, DATEADD(day, 1, CAST(GETDATE() AS DATE))) 
INSERT INTO Appointments (MedStaffID, PatientID, TimeSlot, AppDate) 
    SELECT ins.MedStaffID, ins.PatientID, ins.TimeSlot, ins.AppDate 
    FROM ins 
    JOIN Users Staff ON (Staff.ID = ins.MedStaffID) 
    JOIN Users Patient ON (Patient.ID = ins.PatientID) 
    WHERE Staff.Clinic = Patient.Clinic 
     AND NOT EXISTS (SELECT * 
        FROM Appointments 
        WHERE (MedStaffID = ins.MedStaffID OR PatientID = ins.PatientID) 
         AND TimeSlot = TimeSlot 
         AND AppDate = ins.AppDate 
       ) 
; 
+0

啊謝謝你的工作,沒有想到這一點,你知道爲什麼讓他們像我這樣設置沒有工作,雖然,好奇。 – Vereonix

0

我還沒有找到確切的問題。然而...

  1. 在未存在的代碼,不應:

    AND TimeSlot = TimeSlot 
    

AND TimeSlot = ins.TimeSlot 
  • 作爲優化步驟,ClinicID檢查應該首先進行。不存在的地方通常是全表掃描(或全索引掃描)。如果桌子總是很小,那不是問題。

  • 作爲優化步驟,where-not-exist子句應該選擇id,而不是*。

  • 它不應該是這樣,但可能是這種情況,因爲我找不到其他東西,操作符優先級正在咬你。圍繞您的ClinicID檢查添加括號(整個表達式)。

  • Explain Query是你的朋友。