Оба запроса одинаковы? - PullRequest
3 голосов
/ 22 июля 2011

Оба запроса одинаковы? Оба возвращают одинаковый результат?

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 ]

4 голосов
/ 22 июля 2011

Они не совпадают.

  • 2-й возвращает данные для обоих условий.
  • 1-й проверяет первым и применяет только одно условие
2 голосов
/ 22 июля 2011

Они семантически не одинаковы.Второй запрос, возможно, вернет записи, которые удовлетворяют обоим предикатам (u.UPIN = @AttendingDoctorID) и (u.FirstName = @AttendingDoctorFirstName AND u.LastName = @AttendingDoctorLastName).

То, произойдет ли это когда-либо, зависит от ваших данных.

1 голос
/ 22 июля 2011

Если вы работаете с уровнем изоляции транзакции по умолчанию, вам также нужно знать, что:

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

Другая транзакция может обновлять Users между выполнением запроса 1 и выполнением запроса 2, и поэтому вы можете получить пустой набор результатов из запроса 2. Ваша вторая версия выполняет все как один запрос, поэтому не будет иметь этой проблемы (но другие указали на другие различия между запросами)

...