T-SQL-запрос для проверки количества существований - PullRequest
1 голос
/ 13 февраля 2010

У меня есть следующая приблизительная структура таблиц:

accounts:
ID INT,
owner_id INT,
currency_id TINYINT

относится к

clients:
ID INT

и

currency_types:
ID TINYINT,
name NVARCHAR(25)

Мне нужно написать хранимую процедуру для проверки существования счетов с определенной валютой и всех других, т. Е. У клиента могут быть счета в определенной валюте, некоторых других валютах и ​​обоих.

Я уже написал этот запрос:

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, поэтому заранее спасибо!

Ответы [ 2 ]

1 голос
/ 13 февраля 2010

Мне кажется вполне разумным, EXISTS даст хорошие результаты для такого рода вещей.

Есть ли у вас основания полагать, что его нужно оптимизировать? Это плохо работает?

Главное, чтобы убедиться, что у вас есть подходящие индексы (например, для учетных записей. [Owner_id], CT.ID, очевидно, является PK)

0 голосов
/ 15 февраля 2010

Для такого запроса требуется на один SELECT меньше:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...