|
Изменилась сортировка после перехода на MS SQL | ☑ | ||
---|---|---|---|---|
0
Gsoom2010
13.12.12
✎
21:50
|
Добрый день.
До недавнего времени база работала в файловом варианте, недавно перевели на MS SQL 2008 EXPRESS и обнаружилась следующая вещь: У меня в документе есть таблица значений (ссылки на другие документы): 1. Документы №1 |
|||
1
Gsoom2010
13.12.12
✎
21:52
|
2. Документ № 2
3. Документ № 3 Я делаю отчёт из документа получая во временную таблицу список этих документов, а после левым соединением вытягиваю по этим документам прочую информацию |
|||
2
Gsoom2010
13.12.12
✎
21:52
|
В файловом варианте в таком отчёте сохранялся порядок следования документов как он был изначально, но после перехода на MS SQL порядок в отчёте сбивается.
|
|||
3
Gsoom2010
13.12.12
✎
21:53
|
Если в файловом я получал в отчёте:
1. Документ 1 2. Документ 2 3. Документ 3 то в SQL получаю не обязательно такой порядок |
|||
4
Gsoom2010
13.12.12
✎
21:54
|
А порядок в этом отчёте очень важен, поэтому вопрос - куда смотреть чтобы найти как оставить порядок без изменений
|
|||
5
H A D G E H O G s
13.12.12
✎
21:54
|
Текст запроса.
|
|||
6
МихаилМ
13.12.12
✎
21:55
|
бывает такое.
collation ms sql ? рег настройки ? |
|||
7
Gsoom2010
13.12.12
✎
21:55
|
Сам запрос:
МенеджерВТ = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = МенеджерВТ; Запрос.Текст = " |ВЫБРАТЬ | Таблица.Накладная как Документ |ПОМЕСТИТЬ ВременнаяТаблица |ИЗ | &Таблица КАК Таблица"; // Устанавливаем таблицу Запрос.УстановитьПараметр("Таблица", ГрузовыеНакладные); // Выполняем запрос Запрос.Выполнить(); Запрос.Текст = " |ВЫБРАТЬ | ВременнаяТаблица.Документ | Прочие данные по документу |ИЗ | ВременнаяТаблица КАК ВременнаяТаблица | ЛЕВОЕ СОЕДИНЕНИЕ | РегистрСведений.КэшГрузовыхНакладных КАК КэшГрузовыхНакладных | ПО | ВременнаяТаблица.Документ.Ссылка = КэшГрузовыхНакладных.Накладная.Ссылка | |ИТОГИ | СУММА(СтоимостьГруза) |ПО | ОБЩИЕ"; |
|||
8
Gsoom2010
13.12.12
✎
21:56
|
(6) Я с MS SQL никогда ранее не работал, только два дня как перевёл базу "попробовать" так что не совсем понимаю что вы спрашиваете
|
|||
9
Александр_
Тверь 13.12.12
✎
21:57
|
(8) в случае, когда порядок сортировки не задан явно, строки будут выводиться в произвольным образом. Точка.
В твоем случае, нужно добавить сортировку. |
|||
10
Живой Ископаемый
13.12.12
✎
21:58
|
2(7) Так тут же нет сортировки?
Что теперь нужно? |
|||
11
H A D G E H O G s
13.12.12
✎
21:59
|
(9) Нет.
|
|||
12
Gsoom2010
13.12.12
✎
21:59
|
Дело в том что мне важно сохранить сортировку как в документе, может быть есть обходные пути?
|
|||
13
H A D G E H O G s
13.12.12
✎
21:59
|
ВременнаяТаблица.Документ.Ссылка = КэшГрузовыхНакладных.Накладная.Ссылка
заменить на ВременнаяТаблица.Документ = КэшГрузовыхНакладных.Накладная |
|||
14
Александр_
Тверь 13.12.12
✎
21:59
|
(12) добавь номер строки во временную таблиц и по ней сортируй.
|
|||
15
Gsoom2010
13.12.12
✎
22:00
|
(14) гениально
|
|||
16
H A D G E H O G s
13.12.12
✎
22:00
|
Забавно, никогда не проверял, кто будет "сильнее" в случае соединения 2-х таблиц.
|
|||
17
Gsoom2010
13.12.12
✎
22:00
|
Извиняюсь за тупняк
|
|||
18
H A D G E H O G s
13.12.12
✎
22:00
|
(9) РС будет сортироваться в зависимости от TableScan/ IndexScan
|
|||
19
H A D G E H O G s
13.12.12
✎
22:01
|
И вот скорее всего он "утягивает" за собой ТЗ
|
|||
20
Gsoom2010
13.12.12
✎
22:01
|
(19) Спасибо за помошь
|
|||
21
Александр_
Тверь 13.12.12
✎
22:02
|
(18) т.е. ты сможешь автору гарантировать, что его отчет будет выводиться в нужном порядке, без применения явной сортировки?
|
|||
22
H A D G E H O G s
13.12.12
✎
22:03
|
(21) Нет конечно. Я просто говорю, что не "строки будут выводиться в произвольным образом", а в зависимости от TableScan/ IndexScan
|
|||
23
H A D G E H O G s
13.12.12
✎
22:04
|
(20) Не забудь про (13)
|
|||
24
Нуф-Нуф
13.12.12
✎
22:04
|
нигде нет сортировки. какие могут быть вопросы?
|
|||
25
Александр_
Тверь 13.12.12
✎
22:05
|
(22) хех...
естественно, что они будут выводиться не рандомно, а подчиняясь какому-то внутреннему алгоритму. Но сточки зрения прикладного программиста это будет рандомно. ИМХО самым правильным подходом будет - явно задать критерий сортировки. |
|||
26
Нуф-Нуф
13.12.12
✎
22:05
|
(22) каким боком тут твое TableScan/ IndexScan
|
|||
27
Gsoom2010
13.12.12
✎
22:06
|
(23) Да уже заменил
(21) Добавил в ВТ номер строки и по нему сортирую конечный результат, всё работает, спасибо! |
|||
28
H A D G E H O G s
13.12.12
✎
22:06
|
(26) Иди почитай немного хорошей, олдскульной теории.
http://www.sql.ru/articles/mssql/03013101indexes.shtml#9 |
|||
29
Александр_
Тверь 13.12.12
✎
22:08
|
(27) ты, кстати, про пакетные запросы слышал?
Так, как ты написал (явное использование менеджера временных таблиц) может быть востребовано в ограниченном количестве случаев. Лучше с точки зрения наглядности (а так же быстродействия) использовать пакетный запрос. |
|||
30
Gsoom2010
13.12.12
✎
22:13
|
(29) Не не слышал, сейчас почитаю
|
|||
31
Gsoom2010
13.12.12
✎
22:16
|
(29) Спасибо за подсказку, на днях буду переписывать на пакетный запрос.
|
|||
32
ShoGUN
13.12.12
✎
22:55
|
(26) в (18) Всё правильно написано, другое дело, что в другой СУБД порядок теоретически может измениться. Если сортировка явно не оговорена, то строки просто выдаются в том же порядке, в котором были получены СУБД из базы.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |