2

の値をEXISTSクエリの一部として使用することはできますか?

(注意: 残念ながら、クライアントの制約により、SQLServer 2005 互換の回答が必要です!)

したがって、一連の結果を返す場合、列の 1 つは、サブクエリが行を返すかどうかを示すブール値です。

たとえば、ユーザー名のリストと、別のテーブルに各ユーザーの行が含まれているかどうかを返したいとします。以下は構文的に正しくありませんが、私の言いたいことが理解できると思います...

SELECT T1.[UserName],
    (EXISTS (SELECT * 
             FROM [AnotherTable] T2 
             WHERE T1.[UserName] = T2.[UserName])
    ) AS [RowsExist]
FROM [UserTable] T1

結果セットには、 と呼ばれる列と[UserName]と呼ばれるブール列が含まれ[RowsExist]ます。

明らかな解決策はCASE、以下のような a を使用することですが、それを行うためのより良い方法があるかどうか疑問に思いました...

SELECT T1.[UserName],
    (CASE (SELECT COUNT(*)
           FROM [AnotherTable] T2 
           WHERE T1.[UserName] = T2.[UserName]
          )
          WHEN 0 THEN CAST(0 AS BIT)
          ELSE CAST(1 AS BIT) END
    ) AS [RowsExist]
FROM [UserTable] T1
4

3 に答える 3

2

2 番目のクエリは有効な構文ではありません。

SELECT T1.[UserName],
       CASE
         WHEN EXISTS (SELECT *
                      FROM   [AnotherTable] T2
                      WHERE  T1.[UserName] = T2.[UserName]) THEN CAST(1 AS BIT)
         ELSE CAST(0 AS BIT)
       END AS [RowsExist]
FROM   [UserTable] T1 

通常は問題なく、準結合として実装されます。

CASE 式のサブクエリの記事では、これについて詳しく説明しています。

場合によっては、ここで説明するようCOUNTに、実際にはクエリのパフォーマンスが向上する可能性があります

于 2013-09-13T13:44:56.910 に答える
1

ここに書いたことから、最初のクエリを次のように変更します

SELECT
        T1.[UserName], ISNULL(
            (
                SELECT
                        TOP 1 1
                    FROM [AnotherTable]
                    WHERE EXISTS
                        (
                            SELECT
                                    1
                                FROM [AnotherTable] AS T2
                                WHERE T1.[UserName] = T2.[UserName]
                        )
            ), 0)
    FROM [UserTable] T1

しかし、実際に使用するTOP 1 1場合は必要ありませんEXISTS、次のように書くこともできます

SELECT
        T1.[UserName], ISNULL(
            (
                SELECT
                        TOP 1 1
                    FROM [AnotherTable] AS T2
                    WHERE T1.[UserName] = T2.[UserName]
            ), 0)
    FROM [UserTable] T1
于 2013-09-13T13:43:35.013 に答える
1

私は他の人のSQLの方が好きですが、私はこれを書きました:

with bla as (
    select t2.username, isPresent=CAST(1 AS BIT)
    from t2
    group by t2.username
)
select t1.*, isPresent = isnull(bla.isPresent, CAST(0 AS BIT))
from t1 
    left join blah on t1.username=blah.username
于 2013-09-13T13:48:48.977 に答える