2014 dxdy logo

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

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




 
 SQL Count
Сообщение15.10.2009, 12:36 
Надоело в общем случае считать число строк, возвращаемых запросом каким-то отдельным образом. Поэтому вопрос:
Пусть есть запрос $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 
А как результат сортироваться должен? Так же, как Т?

 
 
 
 Re: SQL Count
Сообщение15.10.2009, 14:13 
Maslov писал(а):
А как результат сортироваться должен? Так же, как Т?

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

 
 
 
 Re: SQL Count
Сообщение15.10.2009, 14:45 
Не, $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 
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 
Sonic86 в сообщении #251902 писал(а):
вот и приходится потом использовать всякие половые извращения
Честно говоря, не очень понимаю, в чем Ваша проблема.
Есть два основных способа работы с выборкой из базы:
1. Живой коннект (курсор) - результат возвращается после получения из базы первой записи, остальные записи извлекаются по мере необходимости (при навигации по курсору). В этом случае количество результирующих записей не известно до тех пор, пока мы не уперлись в конец выборки.
2. Результат возвращается после того, как из базы извлечены все записи. В этом случае результирующий объект обычно позволяет довольно просто определить количество записей.
Вы с какой базой и через какой программный интерфейс работаете?

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

 
 
 
 Re: SQL Count
Сообщение16.10.2009, 07:05 
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 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group