タイトルが示すように...レコードがテーブルに存在するかどうかを判断するための最小のオーバーヘッドで、最速の方法を見つけようとしています。
サンプルクエリ:
SELECT COUNT(*) FROM products WHERE products.id = ?;
vs
SELECT COUNT(products.id) FROM products WHERE products.id = ?;
vs
SELECT products.id FROM products WHERE products.id = ?;
?
が'TB100'
...と交換されたとしましょう。最初のクエリと2番目のクエリはまったく同じ結果を返します(この会話では... 1
と言います)。最後のクエリは期待どおりに'TB100'
を返すか、またはテーブルにid
が存在しない場合は何も返しません。
目的はid
がテーブルにあるかどうかを判断することです。そうでなければ、プログラムは次にレコードを挿入し、もしそうであれば、プログラムはそれをスキップするか、またはこの質問の範囲外の他のプログラム論理に基づいてUPDATE照会を実行する。
どちらが速くてオーバーヘッドが少ないですか? (これはプログラムの実行ごとに何万回も繰り返され、1日に何回も実行されます)。
(M $提供のJDBCドライバを介してJavaからM $ SQL Serverに対してこのクエリを実行する)
SELECT TOP 1 products.id FROM products WHERE products.id = ?;
は、最初のレコードを見つけた後で実行を終了するので、すべての提案より優れています。
EXISTS
(またはNOT EXISTS
)は、何かが存在するかどうかをチェックするために特別に設計されているので、それが最良の選択肢であるべきです(そしてそうである)。一致する最初の行で停止するので、TOP
節は不要で、実際にはデータを選択しないので、列のサイズにオーバーヘッドはありません。ここでSELECT *
を安全に使うことができます - SELECT 1
、SELECT NULL
またはSELECT AnyColumn
... と違いはありません(SELECT 1/0
のような無効な表現を使うことさえでき、それで壊れません) .
IF EXISTS (SELECT * FROM Products WHERE id = ?)
BEGIN
--do what you need if exists
END
ELSE
BEGIN
--do what needs to be done if not
END
何も勝てない -
SELECT TOP 1 1 FROM products WHERE id = 'some value';
あなたはテーブルにデータがあるかどうかを知るために数える必要はありません。そして必要でないときはエイリアスを使わないでください。
SELECT CASE WHEN EXISTS (SELECT TOP 1 *
FROM dbo.[YourTable]
WHERE [YourColumn] = [YourValue])
THEN CAST (1 AS BIT)
ELSE CAST (0 AS BIT) END
この方法ではブール値が返されます。
また使用することができます
If EXISTS (SELECT 1 FROM dbo.T1 WHERE T1.Name='Scot')
BEGIN
--<Do something>
END
ELSE
BEGIN
--<Do something>
END
誰かがまだそれについて言及しているとは思わないでくださいが、データがあなたの下で変化しないと確信しているならば、あなたはそれが読むときブロックされないことを確実にするためにNoLockヒントも適用したくなるでしょう。
SELECT CASE WHEN EXISTS (SELECT 1
FROM dbo.[YourTable] WITH (NOLOCK)
WHERE [YourColumn] = [YourValue])
THEN CAST (1 AS BIT)
ELSE CAST (0 AS BIT) END
SELECT COUNT(*) FROM products WHERE products.id = ?;
これは、すべてのデータベースで機能するクロスリレーショナルデータベースソリューションです。
以下は、レコードがデータベースに存在するかどうかを判断する最も簡単で最速の方法です。良い点は、すべてのリレーショナルDBで機能することです。
SELECT distinct 1 products.id FROM products WHERE products.id = ?;
私は過去にこれを使用しました、そして、何かが存在するかどうか見るために全テーブルスキャンを必要としません。それは超速いです...
UPDATE TableName SET column=value WHERE column=value
IF @@ROWCOUNT=0
BEGIN
--Do work
END
MySQLやOracleの経歴からこれに悩まされている人々のために - MySQLは限られた数のレコードを選択するためのLIMIT句をサポートしていますが、OracleはROWNUMを使用します。
create or replace procedure ex(j in number) as
i number;
begin
select id into i from student where id=j;
if i is not null then
dbms_output.put_line('exists');
end if;
exception
when no_data_found then
dbms_output.put_line(i||' does not exists');
end;