2011-07-22 130 views
3

這兩個查詢都是一樣的嗎? 兩者都返回相同的結果嗎?這兩個查詢都一樣嗎?

1)

IF EXISTS(
    SELECT 
     1 
    FROM 
     Users u 
    WHERE 
     u.UPIN = @AttendingDoctorID) 
BEGIN 
    SELECT 
     u.UserId, 1 
    FROM 
     Users u WITH(nolock) 
    WHERE 
     u.UPIN = @AttendingDoctorID 
END ELSE BEGIN 
    SELECT 
     u.UserId, 
     1 
    FROM 
     Users u (nolock) 
    WHERE 
     u.FirstName = @AttendingDoctorFirstName AND 
     u.LastName = @AttendingDoctorLastName 
END 

2)

SELECT 
u.UserId, 1 
FROM 
    Users u (nolock) 
WHERE 
    (u.UPIN = @AttendingDoctorID) 
    OR 
    (u.FirstName = @AttendingDoctorFirstName AND 
    u.LastName = @AttendingDoctorLastName) 

回答

4

它們是不一樣的。

  • 第二個返回數據爲均爲條件。
  • 一日一個測試第一和適用條件只有一個
2

他們不是語義上是相同的。第二個查詢可能會返回滿足謂詞(u.UPIN = @AttendingDoctorID)(u.FirstName = @AttendingDoctorFirstName AND u.LastName = @AttendingDoctorLastName)的記錄。

這是否會發生取決於您的數據。

1

假設你的默認事務隔離級別下運行,您還需要注意的是:

IF EXISTS(
    SELECT 
     1 
    FROM 
     Users u 
    WHERE 
     u.UPIN = @AttendingDoctorID) --<-- Query 1 
BEGIN 
    SELECT 
     u.UserId, 1 
    FROM 
     Users u WITH(nolock) 
    WHERE 
     u.UPIN = @AttendingDoctorID --<-- Query 2 
END ELSE BEGIN 
    SELECT 
     u.UserId, 
     1 
    FROM 
     Users u (nolock) 
    WHERE 
     u.FirstName = @AttendingDoctorFirstName AND 
     u.LastName = @AttendingDoctorLastName 
END 

另一個交易可能會更新查詢1之間Users執行和查詢2執行,所以你可能會得到從查詢2中得到一個空的結果集。你的第二個版本以單個查詢的形式運行所有內容,所以不會有這個問題(但其他人指出了查詢之間的其他區別)

+0

這裏沒有任何事務。在此之前,邏輯必須chk – Sreekumar

相關問題