2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 SQL Count
Сообщение15.10.2009, 12:36 
Заслуженный участник


08/04/08
8562
Надоело в общем случае считать число строк, возвращаемых запросом каким-то отдельным образом. Поэтому вопрос:
Пусть есть запрос $Q$ длины $L$, возвращающий таблицу $T$. Существует ли запрос $f(Q)$ длиной не более, чем $L+C, C=const$, возвращающий таблицу $T$, декартово умноженную на таблицу $1 \times 1$ (на 1 ячейку то есть), содержащую число строк в таблице $T$?
Очень надо знать как можно более простой $f(Q)$, запросы очень отвратительно выглядят.

 Профиль  
                  
 
 Re: SQL Count
Сообщение15.10.2009, 13:04 
Заслуженный участник


09/08/09
3438
С.Петербург
А как результат сортироваться должен? Так же, как Т?

 Профиль  
                  
 
 Re: SQL Count
Сообщение15.10.2009, 14:13 
Заслуженный участник


08/04/08
8562
Maslov писал(а):
А как результат сортироваться должен? Так же, как Т?

Это не имеет значения. Значит так же, как Т :-)

 Профиль  
                  
 
 Re: SQL Count
Сообщение15.10.2009, 14:45 
Заслуженный участник


09/08/09
3438
С.Петербург
Не, $L+C $у меня даже без сортировки результата не получается, получается только $2L+C$ (*):
Код:
select v.*, c.* from
(select * from tbl) v,
(select count(*) as cnt from (select * from tbl) v1) c
(предполагается, что исходный запрос - select * from tbl)

А если сортировка результата нужна, всё ещё хуже - надо вытаскивать ORDER BY из исходного запроса и переносить во внешний.

Причём в обоих случаях подобные манипуляции могут на производительности сказаться самым катастрофическим образом.

(*) синтаксис MS SQL Server

 Профиль  
                  
 
 Re: SQL Count
Сообщение15.10.2009, 16:00 
Заслуженный участник


08/04/08
8562
Maslov писал(а):
Не, $L+C $у меня даже без сортировки результата не получается, получается только $2L+C$ (*):
Код:
select v.*, c.* from
(select * from tbl) v,
(select count(*) as cnt from (select * from tbl) v1) c
(предполагается, что исходный запрос - select * from tbl)

Жаль... очень жаль... вот и приходится потом использовать всякие половые извращения...
Все равно спасибо :-)
Интересно, доказательство того, что такого запроса нет, есть или нету...

 Профиль  
                  
 
 Re: SQL Count
Сообщение15.10.2009, 16:34 
Заслуженный участник


09/08/09
3438
С.Петербург
Sonic86 в сообщении #251902 писал(а):
вот и приходится потом использовать всякие половые извращения
Честно говоря, не очень понимаю, в чем Ваша проблема.
Есть два основных способа работы с выборкой из базы:
1. Живой коннект (курсор) - результат возвращается после получения из базы первой записи, остальные записи извлекаются по мере необходимости (при навигации по курсору). В этом случае количество результирующих записей не известно до тех пор, пока мы не уперлись в конец выборки.
2. Результат возвращается после того, как из базы извлечены все записи. В этом случае результирующий объект обычно позволяет довольно просто определить количество записей.
Вы с какой базой и через какой программный интерфейс работаете?

Sonic86 в сообщении #251902 писал(а):
Интересно, доказательство того, что такого запроса нет, есть или нету...
Не думаю, что такое доказательство существует.
Очевидно, что построение нужного Вам запроса (без ограничений на длину) возможно. Что же касается длины, так я о таких доказательствах даже не слышал никогда :)

 Профиль  
                  
 
 Re: SQL Count
Сообщение16.10.2009, 07:05 
Заслуженный участник


08/04/08
8562
Maslov писал(а):
А если сортировка результата нужна, всё ещё хуже - надо вытаскивать ORDER BY из исходного запроса и переносить во внешний.

Я, кстати, в этом случае писал бы примерно так (очень упрощенный вид, ессно):
select t.F1, t.F2,...,
(select count(*)
from Tbl t
where t.G1 = :p1 and t.G2 = :p2 and ...) as CNT
from Tbl t
where t.G1 = :p1 and t.G2 = :p2 and ...
order by t.H
Maslov писал(а):
Честно говоря, не очень понимаю, в чем Ваша проблема.
Есть два основных способа работы с выборкой из базы:
1. Живой коннект (курсор) - результат возвращается после получения из базы первой записи, остальные записи извлекаются по мере необходимости (при навигации по курсору). В этом случае количество результирующих записей не известно до тех пор, пока мы не уперлись в конец выборки.
2. Результат возвращается после того, как из базы извлечены все записи. В этом случае результирующий объект обычно позволяет довольно просто определить количество записей.
Вы с какой базой и через какой программный интерфейс работаете?

Дело в том, что тут у меня несколько способов работы с базой и с разными целями. Есть запросы из Delphi - там просто SQL, хотя есть и хранимые процедуры, где можно использовать PL/SQL, но запросы тут необходимы. Есть некоторые серверные объекты, которые используют только SQL. Короче так: в некоторых частных случаях я бы мог это проблему решить, используя какие-то свои уловки в каждом случае (хотя это бы не везде прошло) (в Delphi например можно найти число строк в результирующем запросе), но было бы решение в общем случае, было бы вообще прекрасно - пользуешься где хочешь и не заморачиваешься. :-)
Maslov писал(а):
Очевидно, что построение нужного Вам запроса (без ограничений на длину) возможно. Что же касается длины, так я о таких доказательствах даже не слышал никогда :-)

Ну я значит тем более. Все-таки еще в книжках пошарюсь...

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group