web-dev-qa-db-ja.com

COUNT(*)はLIMIT 1で1を超えますか?

古いレコードを数えようとしています。制限を設定したにもかかわらず、Postgresが1160の結果を返すのはなぜですか、LIMIT 1 この場合?

SELECT COUNT(*) FROM data WHERE datetime < '2015-09-23 00:00:00' LIMIT 1;
 count
--------
1160
(1 row)

1または0の結果を期待していましたが、1160になります。なぜですか。

6
happy_marmoset

常に1行を返す集計関数count()の結果セットを制限しています。 IE:LIMITingは_FROM data WHERE datetime < '2015-09-23 00:00:00'_だけではなく、count(*)関数の出力を制限しています。

基本的に:

  • Postgresはすべての行を読み取ります_FROM data WHERE datetime < '2015-09-23 00:00:00'_
  • Postgresはそれらをcount(*) sします
  • Postgresは次にLIMITs that count

私はあなたがそれをこれにしたいのではないかと思います:

_SELECT COUNT(*) FROM ( 
    SELECT * FROM data WHERE datetime < '2015-09-23 00:00:00' LIMIT 1
);
_

これは基本的に存在チェックなので、次のこともできます。

_SELECT (EXISTS 
           (SELECT 1 FROM data WHERE datetime < '2015-09-23 00:00:00')
       )::integer;
_
14
Philᵀᴹ

Postgresマニュアルから( http://www.postgresql.org/docs/current/static/queries-limit.html ):

制限カウントが指定されている場合、返される行数はその数にすぎません(ただし、クエリ自体が生成する行数が少ない場合は、それより少ない可能性があります)。

制限は、クエリがスキャンする行数を制限しません-レコードセットに表示される行数にのみ影響します。

3
Cameron
  SELECT 
    count(x.*) OVER() AS total_count,
    x.id,
    x.data_name
  FROM (
         SELECT 
           id,
           data_name
         FROM data 
         WHERE 
           datetime < '2015-09-23 00:00:00' 
         LIMIT 1
       ) x;

それはあなたが望むように結果を与えるでしょう、そしてあなたはフェッチするフィールドをさらに追加し、jsonで集約されたレコードを取得することもできます

0
Newton Singh