سؤال

ولدي SQL سيرفر 2008 الاستعلام

SELECT TOP 10 *
FROM T
WHERE ...
ORDER BY ...

وكنت ترغب في الحصول على أيضا على عدد من الصفوف. الطريق obious هو جعل استعلام الثاني

SELECT COUNT(*)
FROM T
WHERE ...
ORDER BY ...

هل هناك وسيلة فعالة؟

والشكر

هل كانت مفيدة؟

المحلول

هل تريد الاستعلام الثاني؟

SELECT TOP 10
    *, foo.bar
FROM
    T
    CROSS JOIN
    (SELECT COUNT(*) AS bar FROM T WHERE ...) foo
WHERE
    ...
ORDER BY
    ...

وOR

DECLARE @bar int
SELECT @bar = COUNT(*) AS bar FROM T WHERE ...
SELECT TOP 10
    *, @bar
FROM
    T
    CROSS JOIN
    (SELECT COUNT(*) AS bar FROM T WHERE ...) foo
WHERE
    ...
ORDER BY
    ...

وأو (تحرير: استخدام مع)

WITH cTotal AS
(
    SELECT COUNT(*) AS bar FROM T WHERE ...)
)
SELECT TOP 10
    *, cTotal .bar
FROM
    T
WHERE
    ...
ORDER BY
    ...

نصائح أخرى

ما هو في هذه الإجابة يبدو للعمل:

https://stackoverflow.com/a/19125458/16241

وأساسا كنت تفعل:

SELECT top 100 YourColumns, TotalCount = Count(*) Over()
From YourTable
Where SomeValue = 32

وTOTALCOUNT سيكون إجمالي عدد الصفوف. وهي مدرجة في كل صف على الرغم من.

عند اختبرت أظهرت هذه الخطة الاستعلام الجدول فقط يتم ضرب مرة واحدة.

وإزالة جملة ORDER BY من الاستعلام 2ND كذلك.

لا.

وSQL Server لا تبقي COUNT(*) في الفوقية مثل MyISAM، فإنه يحسب في كل مرة.

<القوي> UPDATE: إذا كنت بحاجة إلى تقدير، يمكنك استخدام الإحصاءات الفوقية:

SELECT  rows
FROM    dbo.sysindexes
WHERE   name = @primary_key,

وحيث @primary_key هو اسم المفتاح الأساسي الجدول الخاص بك.

وهذا سيعود COUNT(*) من تحديث إحصاءات الماضي.

SELECT     TOP (2) *,
           (SELECT COUNT(*) AS Expr1 FROM T) AS C
FROM         T
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top