4

SQL Server 2008 R2 を使用しており、条件に一致するテーブルに複数の行が存在するかどうかをテストする効率的な方法を見つけようとしています。

それを行う単純な方法は COUNT です。

IF  (   SELECT  COUNT(*)
        FROM    Table
        WHERE   Column  = <something>
    )   > 1 BEGIN
    ...
END

しかし、これには実際に COUNT を計算する必要があり、無駄です。1つ以上をテストしたいだけです。

私が思いついたのは、TOP 2 の COUNT だけです。

IF  (   SELECT  COUNT(*)
        FROM    (   SELECT  TOP 2   0   x
                    FROM    Table
                    WHERE   Column  = <something>
                )   x
    )   > 1 BEGIN
    ...
END

これは扱いにくく、文書化するにはコメントが必要です。もっと簡潔な方法はありますか?

4

2 に答える 2

1

>1 行をチェックしているテーブルに PK がある場合は、別の EXISTS 句をネストできます。これが速いかどうかはわかりませんが、記録的な結果を達成しています。たとえば、ID という名前の PK を持つ 0 から多数の Location テーブル レコードを持つことができる ID という名前の PK を持つ Station テーブルを想定すると、Location には FK StationID があり、少なくとも 2 つの Location を持つ Station を見つけたいとします。

SELECT s.ID
FROM Station s
WHERE EXISTS (
    SELECT 1
    FROM Location L
    WHERE L.StationID = s.ID
    AND EXISTS (
        SELECT 1
        FROM Location L2
        WHERE L2.StationID = L.StationID
        AND L2.ID <> L.ID
    )
)
于 2013-03-13T15:33:42.520 に答える
0

共有する次のソリューションがあります。これは、パフォーマンス面でより軽い場合があります。SQL 選択が単一のレコードを返すことを確認したら、最初のレコードを取得して処理しようとしていると思います。したがって、続けて取得しますが、一度取得したらすぐに次のレコードを取得してみてください。成功した場合は、複数のレコードが存在することがわかり、例外処理ロジックを開始できます。それ以外の場合でも、単一のレコードを処理できます。

于 2016-09-22T14:42:57.637 に答える