2010-02-13 5 views
1

J'ai la prochaine structure des tables approximatives:requête T-SQL pour vérifier nombre d'existences

accounts: 
ID INT, 
owner_id INT, 
currency_id TINYINT 

liés à

clients: 
ID INT 

et

currency_types: 
ID TINYINT, 
name NVARCHAR(25) 

Je dois écrire une procédure stockée vérifier l'existence de comptes avec une devise spécifique et tous les autres, c.-à-d. le client peut avoir des comptes dans une devise spécifique, d'autres encies et les deux.

Je l'ai déjà écrit cette requête:

SELECT 
    ISNULL((
    SELECT 1 
    WHERE EXISTS 
    (
     SELECT 1 
     FROM [accounts] AS A, [currency_types] AS CT 
     WHERE 
      A.[owner_id] = @client -- sp param 
     AND A.[currency_id] = CT.[ID] 
     AND CT.[name] = N'Ruble' 
    )), 0) AS [ruble], 
    ISNULL((
    SELECT 1 
    WHERE EXISTS 
    ( 
     SELECT A.[ID] 
     FROM [accounts] AS A, [currency_types] AS CT 
     WHERE 
      A.[owner_id] = @client 
     AND A.[currency_id] = CT.[ID] 
     AND CT.[name] != N'Ruble' 
    )), 0) AS [foreign] 

Est-il possible d'optimiser? Je suis nouveau à (T) SQL, donc merci d'avance!

Répondre

0

Cette requête nécessite un SELECT moins:

RETURN ISNULL((SELECT 1 
    WHERE 
     EXISTS 
     (
      SELECT 1 
      FROM [accounts] AS A, [currency_types] AS CT 
      WHERE 
       A.[owner_id] = @client 
      AND A.[currency_id] = CT.[ID] 
      AND CT.[name] != N'Ruble' 

     ) 
    ), 0) 
1

Cela me semble assez raisonnable, EXISTS donnera de bonnes performances pour ce genre de choses.

Avez-vous une raison de penser qu'il doit être optimisé? Est-ce qu'il fonctionne mal?

L'élément clé pour assurer est que vous avez des indices appropriés (par exemple sur les comptes [owner_id], CT.ID est évidemment un PK.)

+0

@ AdaTheDev: Je suis nouveau sur SQL, donc il suffit de s'inquiéter car la requête a 3 SELECTs .. et les deux conditions WHERE sont très similaires donc peut-être qu'ils pourraient être divisés en quelque chose de simple mais complexe. – abatishchev

+1

La sélection externe ne coûtera pas du tout (négligeable). Pour atteindre ce que vous voulez, je pense réellement que l'approche est bonne - ne peut pas voir un moyen facile d'atteindre le même résultat. La complexité, en général, aggrave les choses, car il peut être plus difficile pour SQL Server d'optimiser la requête. – AdaTheDev