2010-02-13 58 views
1

的号码,我旁边有近似的表结构:T-SQL查询,以检查存在物

accounts: 
ID INT, 
owner_id INT, 
currency_id TINYINT 

相关

clients: 
ID INT 

currency_types: 
ID TINYINT, 
name NVARCHAR(25) 

我需要写一个存储过程检查是否存在具有特定货币和所有其他货币的账户,即客户可以使用特定货币账户和其他账户encies和两者。

我已经写此查询:

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] 

是否有可能进行优化呢?我是(T)SQL的新手,非常感谢!

回答

0

这样的查询需要一个选择少:

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

对我来说似乎很合理,EXISTS会给这种事情带来好的表现。

您是否有理由认为需要优化?它表现糟糕吗?

,以确保关键的是,你有合适的指标(如应收[owner_id],CT.ID显然是一个PK。)

+0

@ AdaTheDev:我是新来的SQL,所以只是担心,因为查询有3个SELECTs ..和两个WHERE条件非常相似,所以也许他们可以拆分成单一但复杂的东西。 – abatishchev 2010-02-13 20:44:07

+1

外部选择不会花费太多(可忽略)。为了实现你想要的,我实际上认为这种方法很好 - 看不到一个简单的方法来达到同样的结果。复杂性通常会使事情变得更糟,因为它可能使SQL Server更难以优化查询 – AdaTheDev 2010-02-13 21:14:26