2011-07-22 69 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

相关问题