2013-06-19 10 views
17

しばしばTSQLで次のクエリを使用して:どのようにすべての列を選択するには、カウント(*)同じクエリで

SELECT COUNT(*), * 
FROM CUSTOMER c 
WHERE c.Name like 'foo%'; 

私は、Oracle SQL Developerでこのクエリを実行しようとすると、それはありません

"Missing expression"

どのような構文が良いですか?

ありがとうございます。

+0

あなたは...でグループを使用するか、2つのクエリの結果を結合する必要があります。 –

+1

Plzはあなたのテーブルのスキーマを提供しています。 –

+0

SQL Serverでその文が動作するとは思わない –

答えて

4

1つのアプローチは、次のようなことを行うことです。これにより、各行のカウント(*)結果が得られます。しかし、気をつけて、Cartesianjoinがあります。 'foo%'のような行がたくさんある場合、これはひどく実行されます。

select a.cntr, c.* 
from CUSTOMER c 
    , (select count(*) cntr 
    from customer b 
    where b.name like 'foo%') a 
where c.name like 'foo%' 
34

これは、パフォーマンスが向上します:

SELECT COUNT(*) OVER(), c.* 
FROM CUSTOMER c 
WHERE c.Name like 'foo%'; 
+7

説明は良いでしょう – Blauhirn

+2

@Blauhim、それは空のウィンドウ節を持つ分析関数です - それで、結果セット全体の行の数を計算します。通常は、テーブルの各ブロックを1回だけ訪れて、行を数えながらカウントする必要があるため、パフォーマンスが向上します。 –

+0

@Jeffreyこれはいいですが、作成するすべての行の余分な列は、特にすべての列の集計がある場合は、選択カウント(*)よりもオーバーヘッドが発生する傾向があります。最初の行と同じ集約を持つことは可能ですが、各行に対して再度繰り返さないのですか? – user3758745

関連する問題