2013-08-30 2 views
1

Допустим, я бегу следующий SQL SELECT запрос:Очередные результаты и Count (*) в том же запросе

SELECT Name, Age FROM Friends; 

Bilbo|111 
Aragorn|69 

Я хотел бы иметь возможность получить общее количество результатов в такой же запрос.
Однако, если я делаю следующее: отображается

SELECT Count(*),Name, Age FROM Friends; 

2|Aragorn|69 

только конечный результат. Есть ли способ получить все результаты и получить граф с одним SQLite-запросом?

+1

Ваша проблема в том, что Бильбо было 41 год, когда родился Арагорн, поэтому Арагорн был бы только около 69 или 70, а не 88. –

+0

33 право? @AdrianWragg – Naga

+0

@Naga Ты думаешь о Фродо. –

ответ

2

Если СУБД поддерживает Оконный Агрегатные функции можно было бы легко:

SELECT Count(*) OVER(),Name, Age FROM Friends; 

В противном случае вы должны (крест) присоединиться:

SELECT cnt,Name, Age FROM Friends, (SELECT Count(*) as cnt FROM Friends); 

или используйте скалярный подзапрос:

SELECT (SELECT Count(*) FROM Friends) as cnt, Name, Age FROM Friends; 
+0

Не могли бы вы прокомментировать, как изменились бы 2-й и 3-й примеры, если бы у меня было предложение WHERE? Первый пример вернул 'ближний '(«: синтаксическая ошибка », поэтому я предполагаю, что он не поддерживается. =/ – Malabarba

+0

Вы должны добавить WHERE-условие к запросу ccount тоже. Вот почему функция OVER настолько хороша, что у вас есть – dnoeth

+0

Глупый вопрос от новичка SQL: В третьем варианте выполняется ли граф только один раз или один раз в строке? – Malabarba

1

Обычно возвращаемый объект результатов, который возвращается, может запрашиваться по его длине; поэтому вы не ставите агрегированную функцию как COUNT в сам SQL-запрос, а просто подсчитываете, сколько строк возвращается.

+0

К сожалению, я задаю этот вопрос конкретно, чтобы избежать этого. Это приложение для Android, где и Java принимает ~ В 1000 раз дольше, чем SQLite, чтобы подсчитывать строки. (Фактически, я уже использую отдельный подсчет SQLite для значительного повышения производительности, это вопрос, чтобы уменьшить мои запросы SQLite до 1 вместо 2, чтобы улучшить производительность немного больше.) – Malabarba

1

Если я понимаю ваш вопрос, используйте UNION:

SELECT Name, Age FROM Friends UNION SELECT 'Count', COUNT() FROM Friends; 
+0

(комментарий, который я сделал ранее, был ошибочным, поэтому я удалил его). Это работает (если я добавляю '(*)' после COUNT). – Malabarba

Смежные вопросы