C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
помогите с нахождением баги
telepath
Отправлено: 01.02.2005, 17:59


Станционный диспетчер

Группа: Участник
Сообщений: 132



Доброго времени суток. Не могу понять ошибку, есть sql запрос:

CODE
SELECT CODE_ID, sum(SUMW), sum(SUMB) FROM RES
WHERE REC_ID IN (
SELECT REC_ID FROM REC WHERE (
ORG_ID=1
OR ORG_ID=2
OR ORG_ID=3
OR ORG_ID=4
OR ORG_ID=5
OR ORG_ID=6
OR ORG_ID=7
OR ORG_ID=8
OR ORG_ID=9
OR ORG_ID=10
OR ORG_ID=11
OR ORG_ID=12
OR ORG_ID=13
OR ORG_ID=14
OR ORG_ID=15
OR ORG_ID=16
OR ORG_ID=18
OR ORG_ID=19
OR ORG_ID=20
OR ORG_ID=21
OR ORG_ID=22
OR ORG_ID=23
OR ORG_ID=24
OR ORG_ID=25
) AND (
PER_ID=1
) AND (
YEARS_NUM=2004
) AND (
TYP_ID=2
)
) GROUP BY CODE_ID


как я понимаю возвращаемая таблица не может иметь кол-во записей больше чем значений CODE_ID, но возвращает больше. Почему? Запрос в IB Expert работает нормально в билдере в FIBplus DataSet нет
Guest
Отправлено: 01.02.2005, 18:28


Не зарегистрирован







А почему не так (в области Org_ID) (легче читать)?
CODE

SELECT CODE_ID, sum(SUMW), sum(SUMB)
FROM RES
WHERE REC_ID IN
(SELECT REC_ID  FROM REC
 WHERE (ORG_ID in (1,2,3 ...)) -- или org_id between 1 and 25
     AND PER_ID=1
     AND YEARS_NUM=2004
     AND TYP_ID=2
)
GROUP BY CODE_ID

По условию GROUP BY CODE_ID в результирующем запросе не может быть записей больше, чем число различных значений CODE_ID в подзапросе. Если это не так, то у вас глючит сервер, драйвер, компонент. Вы пытались посмтреть какие строки "лишние"?
telepath
Отправлено: 01.02.2005, 18:37


Станционный диспетчер

Группа: Участник
Сообщений: 132



В области ORG_ID это максимальный запрос, там может быть 1, 2 или 3,7 итд.
А как можно посмотреть? В sql редакторе IB Expert все нормально работает... sad.gif
AVC
Отправлено: 01.02.2005, 18:47


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

В области ORG_ID это максимальный запрос, там может быть 1, 2 или 3,7 итд

Это очевидно. Но строка "3,7" смотрится (да и места занимает меньше) чем Org_ID = 3 or Org_ID = 7". Это так, к слову.

По существу.
Лишние строки это те, которые, например. не попадают в выборку (забудем на время об ограничении Org_ID)
Select distinct Code_ID
From Res
Where 1= 1
and PER_ID=1
and YEARS_NUM=2004
andTYP_ID=2

Число строк и значения полей Code_ID должно в точночти совпвлать с
Select Code_ID, Sum(SUMW)
From Res
Where 1= 1
and PER_ID=1
and YEARS_NUM=2004
andTYP_ID=2

Нужно покакзывать как сравнить эти выборки?
telepath
Отправлено: 01.02.2005, 19:08


Станционный диспетчер

Группа: Участник
Сообщений: 132



вот такой дистинкт показывает такое же кол-во записей как select CODE_ID....

CODE
Select distinct Code_ID From Res Where REC_ID IN (
SELECT REC_ID FROM REC WHERE (
ORG_ID=1
OR ORG_ID=2
OR ORG_ID=3
OR ORG_ID=4
OR ORG_ID=5
OR ORG_ID=6
OR ORG_ID=7
OR ORG_ID=8
OR ORG_ID=9
OR ORG_ID=10
OR ORG_ID=11
OR ORG_ID=12
OR ORG_ID=13
OR ORG_ID=14
OR ORG_ID=15
OR ORG_ID=16
OR ORG_ID=18
OR ORG_ID=19
OR ORG_ID=20
OR ORG_ID=21
OR ORG_ID=22
OR ORG_ID=23
OR ORG_ID=24
OR ORG_ID=25
) AND (
PER_ID=1
) AND (
YEARS_NUM=2004
) AND (
TYP_ID=2
))


Отредактировано telepath — 01/02/2005, 20:11
AVC
Отправлено: 01.02.2005, 19:22


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

вот такой дистинкт показывает такое же кол-во записей как select CODE_ID....

Ну слава богу. Значит это не ошибка сервера а просто вы с ним друг друга не поняли. smile.gif
И все таки, посмотрите какие из строк по вашему мнению лишние, поймите почему.
Не получится — пошлите мне куски этих двух таблиц, достаточные для получения ошибки. Поробую разобраться.
telepath
Отправлено: 01.02.2005, 19:25


Станционный диспетчер

Группа: Участник
Сообщений: 132



Хм... с одной ORG_ID работает нормально, показывает правильно...
telepath
Отправлено: 02.02.2005, 11:43


Станционный диспетчер

Группа: Участник
Сообщений: 132



Вобщем странно, последний CODE_ID повторяется лишних раз 400. Почему, не пойму sad.gif

Вернуться в Работа с базами данных в C++Builder