两个查询都一样吗?

时间:2011-07-22 08:37:56

标签: sql sql-server sql-server-2008 case-when

两个查询是否相同? 两者都返回相同的结果吗?

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)

3 个答案:

答案 0 :(得分:4)

它们不一样。

  • 第二个返回两个条件的数据。
  • 第一个先测试并仅应用一个条件

答案 1 :(得分:2)

它们在语义上并不相同。第二个查询可能会返回同时满足谓词(u.UPIN = @AttendingDoctorID)(u.FirstName = @AttendingDoctorFirstName AND u.LastName = @AttendingDoctorLastName)的记录。

是否会发生这种情况取决于您的数据。

答案 2 :(得分: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和执行查询2之间更新Users,因此您可能会从查询2中获取一个空结果集。您的第二个版本将所有内容作为单个查询运行,因此不会出现此问题(但其他人指出了查询之间的其他差异)