![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сортировка приводит к изменению количества записей, почему?
Kolan © (2008-05-06 11:21:00)Здравствуйте,
Есть вот такой запрос:
SELECT Devices.PartNumber, ParamsDictionary.ParamName, ISNULL(Params.ParamValue, 0) AS ParamValue
FROM Params, Measurments, Devices, ParamsDictionary
WHERE (1=1)
AND (Params.MeasurmentID = Measurments.MeasurmentID)
AND (Measurments.DeviceID = Devices.DeviceID)
AND (Params.ParamID = ParamsDictionary.ParamID)
Он возвращает 565 записей.
1 Rd 10.0
1 Ld 20.0
1 Cd 33.0
1 Cs 0.0
1 Ke 0.0
1 Qm 0.0
1 Ct 0.0
1 Tg 0.0
1 Mq 0.0
1 Mxx 33.0
1 RealResX 40.0
1 RealResY 50.0
1 Rd 3647.7981949631298
1 Ld 4.43077772442183
1 Cd 2.71909446089571E-9
1 Cs 5.3647565251156097E-8
1 Ke 0.21560693096653899
Eсли теперь добавить ORDER BY,
SELECT Devices.PartNumber, ParamsDictionary.ParamName, ISNULL(Params.ParamValue, 0) AS ParamValue
FROM Params, Measurments, Devices, ParamsDictionary
WHERE (1=1)
AND (Params.MeasurmentID = Measurments.MeasurmentID)
AND (Measurments.DeviceID = Devices.DeviceID)
AND (Params.ParamID = ParamsDictionary.ParamID)
ORDER BY
ParamsDictionary.ParamName
то происходит странное, саписей возвращается всего 29:
1 AResX 1237.0
1 AResX 1058.0
1 AResX 1422.0
1 AResX 1241.0
1 AResX 1011.0
1 AResX 14930.0
1 AResX 15000.0
1 AResX 14790.0
1 AResX 14870.0
1 AResX 15656.0
1 AResY -3.4609389132356227E-5
1 AResY -3.0261965378031164E-5
1 AResY -2.8533385432183422E-5
1 AResY -3.3117547815209036E-5
1 AResY -2.5954816962325822E-5
1 AResY -4.009030973861627E-5
1 AResY -9.8969197281917332E-6
1 AResY -1.1565236945898505E-4
1 AResY -8.7384250946342945E-6
1 AResY -9.1479250841075554E-6
1 Cd 0.0
1 Cd 0.0
1 Cd 0.0
1 Cd 0.0
1 Cd 5.7818401941997712E-6
10 Cd 1.0310782376991499E-9
10 Cd 1.0465605888949501E-9
10 Cd 1.1779648224868799E-9
10 Cd 1.16088739405521E-9
Куда же деваются остальные?
Anatoly Podgoretsky (2008-05-06 16:24:00) [1]И проверь планы.
Anatoly Podgoretsky (2008-05-06 16:23:00) [2]> Kolan (06.05.2008 15:33:13) [13]
Для этого надо разбираться с серверами, как работает объединение, что такое NULL, оптимизаторы.
Ведь количество записей может измениться даже от простой смены порядка.
Повторяю совет - для начала перейди на явные соединения, проверь базу на консистентность или попроси это сделать администратора базы.
Kolan (2008-05-06 15:33:00) [3]> Так тебе и надо суммировать, а не приводить черт знае зачем,
> не нужные запросы.
Да я просто не пойму как может сортировка повлиять на кол-во записей
> Но похоже у тебя порушеная база.
А как это проверить? Не должна была вроде.
Anatoly Podgoretsky (2008-05-06 14:05:00) [4]> Kolan (06.05.2008 13:13:10) [10]
Так тебе и надо суммировать, а не приводить черт знае зачем, не нужные запросы.
Но похоже у тебя порушеная база.
Кроме того, убери ты это неявное соединение, сделай явное внутреннее.
Kolan (2008-05-06 13:24:00) [5]При этом при исполнении этого запроса в прграмме и выводе в отчет даныы похожи на то, что я хочу
Kolan (2008-05-06 13:13:00) [6]А ты не видишь?
1 Cd 33.0
1 Cd 2.71909446089571E-9
1 Cs 0.0
1 Cs 5.3647565251156097E-8
1 RealResX 40.0
1 RealResY 50.0
1 Rd 3647.7981949631298
1 Ld 4.43077772442183
1 Ld 20.0
> И как же ты такое сгрупируешь?
Я думаю что так:
SELECT Devices.PartNumber, ParamsDictionary.ParamName, Sum(ISNULL(Params.ParamValue, 0)) AS ParamValue
FROM Params, Measurments, Devices, ParamsDictionary
WHERE (1=1)
AND (Params.MeasurmentID = Measurments.MeasurmentID)
AND (Measurments.DeviceID = Devices.DeviceID)
AND (Params.ParamID = ParamsDictionary.ParamID)
GROUP BY
Devices.PartNumber, ParamsDictionary.ParamName
И будет
1 Cd 33.0 + 2.71909446089571E-9
1 Cs 0.0 + 5.3647565251156097E-8
1 RealResX 40.0 + 50.0
1 Rd 3647.7981949631298
1 Ld 4.43077772442183 + 20.0
Не пойму где я не прав
Anatoly Podgoretsky (2008-05-06 13:05:00) [7]
> Я вообще хочу их сгрупировать, но групировка тоже странно
> работает.
И как же ты такое сгрупируешь?
И почему у тебя все странно?
Anatoly Podgoretsky (2008-05-06 13:04:00) [8]
> Эмм… Где грязь?
А ты не видишь?
1 Cd 33.0
1 Cd 2.71909446089571E-9
1 Cs 0.0
1 Cs 5.3647565251156097E-8
1 RealResX 40.0
1 RealResY 50.0
1 Rd 3647.7981949631298
1 Ld 4.43077772442183
1 Ld 20.0
Kolan (2008-05-06 12:45:00) [9]> У тебя в НД 4 одинаковых значения. Вопрос: а нафига?
Потому, что у них разные другие поля, номера измерения напрмер. См. условие WHERE в [0].
Я вообще хочу их сгрупировать, но групировка тоже странно работает. Стал пробовать. А что-то не то даже при сортироваке
Ega23 (2008-05-06 12:39:00) [10]
1 Cd 0.0
1 Cd 0.0
1 Cd 0.0
1 Cd 0.0
У тебя в НД 4 одинаковых значения. Вопрос: а нафига?
Kolan (2008-05-06 12:19:00) [11]> А как ты в этой грязи разбираешься, какой Cd нужный, правильный?
Эмм Где грязь?
Для яность тогда скажу, что таблицы такие:
Params
3 MeasurmentID int 4 0
2 ParamID int 4 0
0 ParamValue float 8 1
Measurments
3 MeasurmentID int 4 0
0 DeviceID int 4 0
0 OperatorID int 4 0
0 OperationID int 4 1
0 CharacteristicsFileName varchar 1024 1
0 MeasurmentDateTime datetime 8 0
0 Note varchar 50 1
Devices
3 DeviceID int 4 0
0 DeviceNumber int 4 0
0 PartNumber int 4 0
0 DeviceTypeID int 4 0
ParamsDictionary
3 ParamID int 4 0
0 ParamName varchar 20 0
Anatoly Podgoretsky (2008-05-06 11:43:00) [12]> Kolan (06.05.2008 11:21:00) [0]
А как узнал,
А как ты в этой грязи разбираешься, какой Cd нужный, правильный?
Kolan (2008-05-06 11:37:00) [13]Из QueryAnalyzera
Sergey13 (2008-05-06 11:31:00) [14]> [0] Kolan © (06.05.08 11:21)
> саписей возвращается всего 29:
А из чего это видно?
Kolan (2008-05-06 11:21:00) [15]Использую MS SQL Server 2000. Rjyrhtnyj MSDE