1. ホーム
  2. sql

[解決済み] Exists 1 または Exists * を使用したサブクエリ

2023-03-07 05:44:37

質問

EXISTSのチェックをこのように書いていました。

IF EXISTS (SELECT * FROM TABLE WHERE Columns=@Filters)
BEGIN
   UPDATE TABLE SET ColumnsX=ValuesX WHERE Where Columns=@Filters
END

前世のDBAの一人が言っていたのですが、私が EXISTS 節を使用し SELECT 1 の代わりに SELECT *

IF EXISTS (SELECT 1 FROM TABLE WHERE Columns=@Filters)
BEGIN
   UPDATE TABLE SET ColumnsX=ValuesX WHERE Columns=@Filters
END

これは本当に違いがあるのでしょうか?

どのように解決するのですか?

いいえ、SQL Server は賢いので、EXISTS に使用されていることを認識し、システムに NO DATA を返します。

Microsoft の言葉を引用します。 http://technet.microsoft.com/en-us/library/ms189259.aspx?ppud=4

サブクエリのセレクトリスト EXISTSによって導入されるサブクエリのセレクトリストは、ほとんどの場合 はアスタリスク (*) で構成されています。これは カラム名を列挙する理由はありません。 で指定された条件を満たす行があるかどうかをテストしているだけだからです。 をテストしているだけだからです。 サブクエリで指定された条件を満たす行が存在するかどうかをテストしているだけだからです。

自分で確認するには、次のように実行してみてください。

SELECT whatever
  FROM yourtable
 WHERE EXISTS( SELECT 1/0
                 FROM someothertable 
                WHERE a_valid_clause )

SELECTリストで実際に何かを行っているのであれば、div by zeroエラーを投げるはずです。そうではありません。

EDIT: 標準SQLは実際にこのことについて述べています。

ANSI SQL 1992 標準、191 ページ http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

<ブロッククオート

3)ケース

a) もし <select list> "*"が単に <subquery> に含まれるだけです。 に含まれ、その直後に <exists predicate> に含まれる場合、その <select list> は と等価であり <value expression> というのは、任意の <literal> .