两个查询是否相同? 两者都返回相同的结果吗?
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)
答案 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中获取一个空结果集。您的第二个版本将所有内容作为单个查询运行,因此不会出现此问题(但其他人指出了查询之间的其他差异)