[解決済み] Exists 1 または Exists * を使用したサブクエリ
質問
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>
.
関連
-
[解決済み] ストアドプロシージャ 'dbo.aspnet_CheckSchemaVersion' が見つかりませんでした。
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] SQL Server テーブルにカラムが存在するかどうかを確認する方法は?
-
[解決済み] SQL ServerでJOINを使用してUPDATE文を実行するにはどうすればよいですか?
-
[解決済み] SQL Server にテーブルが存在するかどうかを確認する
-
[解決済み] テーブルが存在する場合、それを削除するにはどうすればよいですか?
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
-
[解決済み] T-SQLでテーブル変数をSELECT INTOする
-
[解決済み] SET NOCOUNT ON 使用法
-
[解決済み] SQL ServerでINNER JOINを使用して削除するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SQL Selectステートメントでブール値を返す
-
MySQL】1136 - 列数が1行目の値数と一致しない問題を解決
-
[解決済み] ストアドプロシージャ 'dbo.aspnet_CheckSchemaVersion' が見つかりませんでした。
-
[解決済み] SQL Server にテーブルが存在するかどうかを確認する
-
[解決済み] SQL Serverでストアドプロシージャ内のテキストを検索する
-
[解決済み] SQL Server の CASE ステートメントで OR がサポートされていない。
-
[解決済み] NOT IN vs NOT EXISTS
-
[解決済み] 既存のカラムにIDを追加する
-
[解決済み] T-SQL文の接頭辞Nの意味と使うべきタイミングは?
-
[解決済み】Count(*)とCount(1)の比較 - SQL Server