2013-06-19 28 views
17

在經常在TSQL使用下面的查詢選擇所有列,和COUNT(*):如何在同一查詢

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

當我嘗試在Oracle SQL Developer中它沒有執行這個查詢工作,並給我一個錯誤:

"Missing expression"

什麼是好的語法?

在此先感謝。

+0

你將不得不使用組..或合併兩個查詢的結果。 –

+1

Plz提供你的表的模式.. –

+0

我不相信這個語句在SQL Server中工作 –

回答

4

一種方法是做類似下面的事情。這將導致每行的計數(*)結果。但要小心,有一個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,它是一個帶有空窗口子句的分析函數 - 因此它計算整個結果集的行數。它通常會表現得更好,因爲它應該只訪問一次表格的每個塊,對行進行計數。 –

+0

@Jeffrey這很好,但它創建的每一行的額外列往往會導致比選擇計數(*)更多的開銷,特別是如果每​​個列都有一個聚合。是否有可能只有第一行有相同的聚合,並且不再爲每一行重複? – user3758745

相關問題