22.09.2009, 12:54 | #1 |
Участник
|
select Count(RecId) и join
Добрый день.
Задача посчитать количество записей в таблице по какому-то условию, т.е. простой select Count(RecId) from Table1. Это работает до тех пор пока я не пытаюсь усложнить условия выбора и связать Table1 с другой таблицей, например: select Count(RecId) from Table1 join Table2 where Table1.field1 == Table2.field1 && Table2.field2 == "111" Сразу возникает ошибка с сообщением: Сообщение (14:50:13) Невозможно выбрать запись в "Складские проводки" ("InventTrans") Ссылка: Заказ, . База данных SQL обнаружила ошибку. Описание ошибки SQL: ORA-00937: not a single-group group function Оператор SQL: ... Судя по сообщению, SQL-ю нужна группировка (group), но мне то она не нужна, мне нужно количество всех записей, а не количество записей в группах!! Как решить эту задачу? |
|
22.09.2009, 12:57 | #2 |
Участник
|
группируйте по DataAreaId или TableId
|
|
22.09.2009, 13:06 | #3 |
Участник
|
Спасибо, помогло!
На самом деле у меня три join, в каждом вставил group by TableId и запрос стал выполняться. |
|
22.09.2009, 13:37 | #4 |
Участник
|
Делайте exists join, иначе найдете неверное количество записей в основной таблице.
__________________
// no comments |
|
22.09.2009, 14:02 | #5 |
Участник
|
Синтаксис вида
join Table where ... предполагает, что из таблицы Table необходимо взять все поля. Что противоречит аггрегирующей функции Count() в первом select. Необходимо либо добавить аггрегирующую функцию и во вторую таблицу X++: select Count(RecId) from Table1 join Count(RecId) from Table2 where Table1.field1 == Table2.field1 && Table2.field2 == "111" X++: select Count(RecId) from Table1 join TableId from Table2 where Table1.field1 == Table2.field1 && Table2.field2 == "111" Ну, или воспользоваться советом dech и использовать exists join. Но это уже зависит от того, какое именно количество нужно подсчитать. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
04.09.2012, 15:31 | #6 |
Участник
|
X++: select count (RecId) from inventTrans group by ItemId join inventDim group by InventSizeId, InventLocationId, InventColorId where inventDim.inventDimId == inventTrans.inventDimId && inventDim.InventLocationId == inventLocation.InventLocationId; в этом варианте RecId = 1, хотя на самом деле строк больше. |
|
04.09.2012, 15:47 | #7 |
Участник
|
Цитата:
Сообщение от propeller
X++: select count (RecId) from inventTrans group by ItemId join inventDim group by InventSizeId, InventLocationId, InventColorId where inventDim.inventDimId == inventTrans.inventDimId && inventDim.InventLocationId == inventLocation.InventLocationId; Если первое - то только перебором, если второе - то просто уберите все group by. Это количество строк в первой группе. P.S.: Ещё, если очень хочется, то задачу рассчёта количества групп можно преобразовать в задачу подсчёта неповторяющихся строк, которую можно попытаться решить через notexists join. Последний раз редактировалось S.Kuskov; 04.09.2012 в 16:05. |
|
04.09.2012, 15:57 | #8 |
Участник
|
Если это нужно для отрисовки индикатора сосояния процесса, то вместо того чтобы пытаться рассчитать число групп, можно в качестве общего числа итераций задать общее число строк во всех группах, а потом при прохождении каждой группы уеличивать счётчик пройденных итераций не на еденицу а на число строк в пройденной группе. Если число групп относительно велико и их размер более-менее однороден, то индикатор будет двигаться достаточно плавно.
|
|
|
За это сообщение автора поблагодарили: propeller (1). |
Теги |
count, exists, join, recid, select |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|