180

タイトルが示すように...テーブルにレコードが存在するかどうかを判断するために、オーバーヘッドを最小限に抑えて最速の方法を見つけようとしています。

サンプルクエリ:

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 に対してこのクエリを実行します)

4

14 に答える 14

232

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
于 2013-08-07T22:17:28.673 に答える
25

勝るものなし -

SELECT TOP 1 1 FROM products WHERE id = 'some value';

テーブルにデータがあるかどうかを知るために数える必要はありません。また、必要がない場合はエイリアスを使用しないでください。

于 2013-08-07T22:09:52.173 に答える
11

使用することもできます

 If EXISTS (SELECT 1 FROM dbo.T1 WHERE T1.Name='Scot')
    BEGIN
         --<Do something>
    END 

ELSE    
     BEGIN
       --<Do something>
     END
于 2016-08-17T10:11:59.573 に答える
3
SELECT COUNT(*) FROM products WHERE products.id = ?;

これは、すべてのデータベースで機能するクロス リレーショナル データベース ソリューションです。

于 2015-09-21T09:12:38.827 に答える
0

MySqlの場合、以下のようにLIMITを使用できます(例はPHPで示しています)

  $sql = "SELECT column_name FROM table_name WHERE column_name = 'your_value' LIMIT 1";
  $result = $conn->query($sql);
  if ($result -> num_rows > 0) {
      echo "Value exists" ;
  } else {
      echo "Value not found";
  }
于 2021-01-31T08:55:17.280 に答える
0

SQL サーバー 2012+

SELECT IIF((SELECT TOP 1 1 FROM dbo.[YourTable] WHERE [YourColumn] = [YourValue]) IS NULL, 0, 1)
于 2021-04-13T06:24:21.430 に答える
0
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;
于 2014-05-25T14:01:54.583 に答える