2011-07-22 6 views
3

Les deux requêtes sont-elles identiques? Les deux retournent-ils le même résultat?Les deux requêtes sont-elles identiques?

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) 

Répondre

4

Ils ne sont pas les mêmes.

  • La 2ème renvoie des données pour les deux conditions.
  • la 1ère première et applique des tests qu'une seule condition
2

Ils ne sont pas sémantiquement la même chose. La deuxième requête peut renvoyer des enregistrements qui remplissent les deux prédicats (u.UPIN = @AttendingDoctorID) et (u.FirstName = @AttendingDoctorFirstName AND u.LastName = @AttendingDoctorLastName).

Que cela se produise ou non dépend de vos données.

1

En supposant que vous utilisez sous le niveau d'isolation de transaction par défaut, vous devez également savoir que:

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 

Une autre transaction pourrait mettre à jour Users entre la requête 1 exécution et requête 2 d'exécution, et ainsi vous pourriez obtenir un ensemble de résultats vide à partir de la requête 2. Votre deuxième version exécute tout comme une seule requête, donc n'aura pas ce problème (mais d'autres ont souligné d'autres différences entre les requêtes)

+0

ici rien à la transaction. Avant cela, la logique doit chk – Sreekumar

Questions connexes