|
Возможно ли выбрать запросом? | ☑ | ||
---|---|---|---|---|
0
aspirator23
20.01.14
✎
10:58
|
Таблица состоит из одного строкового поля длиной 10 символов.
В поле хранятся номера от 1000000000 до 1999999999. При записи номера формируются произвольным образом, поэтому есть пропуски в номерах. Пример:1000000000,1000000001, 1000000005, 1000000024....1999999999. Всего записей около миллиона и они распределены он начала диапазона до конца. Можно запросом выбрать первые 1000 "пропущенных" номера? |
|||
1
Maxus43
20.01.14
✎
11:00
|
можно, предварительно сформировав таблицу Всех номеров. потом соеденить с твоеё
|
|||
2
Лефмихалыч
20.01.14
✎
11:01
|
надо соединит с самсебя, потом выбрать минимум или максимум и там тудым-сюдым.
Это то же самое по сути, что срез на каждую дату |
|||
3
aspirator23
20.01.14
✎
11:03
|
Спасибо, попробую.
|
|||
4
Лефмихалыч
20.01.14
✎
11:03
|
только это будет первая тысяча интервалов с пропусками, а не "первые 1000 "пропущенных""
|
|||
5
МихаилМ
20.01.14
✎
11:14
|
можно.
|
|||
6
aspirator23
20.01.14
✎
11:24
|
Пример запроса бы...
|
|||
7
WildSery
20.01.14
✎
11:29
|
(2) Мне даже интересно стало, как вы этот самый "тудым-сюдым" находить в строке будете. На 1 она отличается или на 100.
|
|||
8
Лефмихалыч
20.01.14
✎
11:30
|
(7) какие строки? В задаче числа русским по белому
|
|||
9
WildSery
20.01.14
✎
11:32
|
(8) Выпейте кофе, проснитесь :)
Перечитайте первую строку. |
|||
10
2mugik
20.01.14
✎
11:34
|
(0)Все-таки оптимальней будет в числа преоразовать наверное.
|
|||
11
КонецЦикла
20.01.14
✎
11:34
|
Какая разница числа-строки, мне тоже интересно как Михалыч найдет если сделать "само с собою"
|
|||
12
КонецЦикла
20.01.14
✎
11:35
|
Строки сравниваются так же как и числа... и соединяются
|
|||
13
Ненавижу 1С
гуру
20.01.14
✎
11:37
|
(11) для чисел гораздо проще определяется "следующее"
поэтому соединив "сам с собой" таблицу находим отсутствующие "следующие" и "предыдущие" ну а дальше уже максимум/минимум определяем интервалы пробелов |
|||
14
Лефмихалыч
20.01.14
✎
11:37
|
дврю
|
|||
15
Лефмихалыч
20.01.14
✎
11:39
|
(9) дык ясен пень, что строку надо расхреначить на отдельные записи, иначе при чем тут запрос?
|
|||
16
WildSery
20.01.14
✎
11:42
|
(15) Какие "отдельные записи"?
Ваш запрос (14) нерабочий (для ТС), поскольку строки нельзя вычитать и прибавлять 1. Если же вы предлагаете сперва пихать в таблицу значений с конвертацией в число, то проще будет не запросом, а собственно по ТЗ и идти, заодно получим не диапазон, а сами пропущенные номера. |
|||
17
Лефмихалыч
20.01.14
✎
11:44
|
а, вот теперь прочитал, да "Таблица состоит из одного строкового поля длиной 10 символов"
в ЖПО такую таблицу, т.к. задача для нее решения не имеет. В ней нет пропусков потому, что там не числа. Любой запрос обделается, когда там появится "1000-Ж-№00012" |
|||
18
Лефмихалыч
20.01.14
✎
11:45
|
(16) а запрос всё равно офигенен, не сочиняй :)
|
|||
19
aspirator23
20.01.14
✎
11:46
|
(17) формат номера соблюдается. "1000-Ж-№00012" - такие варианты исключены.
|
|||
20
Широкий
20.01.14
✎
11:47
|
(18) Времянки то зачем юзать?
(0) Переделай номер на число или храни его отдельным полем |
|||
21
Широкий
20.01.14
✎
11:48
|
+20 Или использовать прмое обращение к базе. Скуль строку умеет в число конвертить
|
|||
22
Лефмихалыч
20.01.14
✎
11:51
|
(20) а что ты предлагаешь? Соединения с вложенными запросами?
|
|||
23
Широкий
20.01.14
✎
11:54
|
(22) Соединить таблицу саму с собой.
Таблица как я понял все же в базе лежит |
|||
24
Cube
20.01.14
✎
11:54
|
Да ладно, чё...
Лефмихалыч нормальный вариант предложил. Моя реализация (тестить можно ла любой конфе с номенклатурой: ВЫБРАТЬ Номенклатура.Код ПОМЕСТИТЬ ИсходнаяТаблица ИЗ Справочник.Номенклатура КАК Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПЕРВЫЕ 1000 ИсходнаяТаблица1.Код КАК Код1, МИНИМУМ(ИсходнаяТаблица2.Код) КАК Код2 ИЗ ИсходнаяТаблица КАК ИсходнаяТаблица1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИсходнаяТаблица КАК ИсходнаяТаблица2 ПО ИсходнаяТаблица1.Код < ИсходнаяТаблица2.Код СГРУППИРОВАТЬ ПО ИсходнаяТаблица1.Код УПОРЯДОЧИТЬ ПО Код1, Код2 |
|||
25
КонецЦикла
20.01.14
✎
11:55
|
Да, работает для чисел, Михалыч, молодец, на sql.ru спистел, признавайся?
|
|||
26
Cube
20.01.14
✎
11:55
|
+(24) Первая 1000 интервалов включает в себя первые 1000 пропущенных... :)
|
|||
27
Широкий
20.01.14
✎
11:57
|
(24) Неправильно
|
|||
28
marvak
20.01.14
✎
11:57
|
Может как нибудь получить временную таблицу с непропущенными номерами и соединить с исходной. Записи, где после соединения будет NULL, будут искомыми. Вот тока как сгенерить таблицу с непропущенными строковыми номерами?
|
|||
29
Cube
20.01.14
✎
11:57
|
(27) Не аргументировано.
|
|||
30
Лефмихалыч
20.01.14
✎
11:58
|
(25) обижаешь. из головы достал
(27),(24) показывай свой вариант без временных таблиц |
|||
31
Cube
20.01.14
✎
11:59
|
(28) Да, это можно, по аналогии со срезом на каждую дату, как писали в (2)
|
|||
32
Широкий
20.01.14
✎
12:03
|
(24) Я вот вижу, что запрос выдает диапазон, причем даже тот, где пропуска нет
|
|||
33
GANR
20.01.14
✎
12:08
|
(0) Теоретически можно, но не нужно, так как для этого придется нумеровать по порядку записи в запросе http://kb.mista.ru/article.php?id=703, а потом соединять пронумерованную таблицу саму с собой по условию
т1.N = т2.N - 1 И т1.НомерДокумента <> т2.т1.НомерДокумента - 1. Операция нумерации записей в запросе 1С достаточно ресурсоемкая, поэтому очень не рекомендую это делать. |
|||
34
GANR
20.01.14
✎
12:10
|
+(33) Так оно еще и строковое - нет, не надо этого делать запросом однозначно (хотя можно легко преобразовать строку в число в рамках запроса).
|
|||
35
Лефмихалыч
20.01.14
✎
12:12
|
(34) ну, расскажи, как в запросе 1С строку в число преобразовать
|
|||
36
Cube
20.01.14
✎
12:17
|
(32) Давай пример диапазона, что обсуждать сферических коней?
|
|||
37
GANR
20.01.14
✎
12:17
|
(35) Можно просто ПОДСТРОКА и ВЫБОР КОГДА и арифметические операции применить в связке.
|
|||
38
Широкий
20.01.14
✎
12:21
|
(36) Ну раз сам не можешь проверить..
2,3,5 "2-3" выдаст - ошибка "1" не выдаст - ошибка |
|||
39
aspirator23
20.01.14
✎
12:22
|
(24) Запрос возвращает
Код1 Код2 0000000000001 0000000000001 0000000000002 0000000000002 0000000000004 0000000000004 0000000000006 0000000000006 0000000000007 0000000000007 0000000000008 0000000000008 0000000000009 0000000000009 0000000000010 0000000000010 0000000000011 0000000000011 0000000000012 0000000000012 0000000000013 0000000000013 0000000000014 0000000000014 0000000000015 |
|||
40
Cube
20.01.14
✎
12:26
|
(38) (39) А, ну да, он же бе пропусков тоже выдает... Ошибочка...
|
|||
41
GANR
20.01.14
✎
12:44
|
Короче, говорю как сертифицированный специалист по SQL-запросам: НЕ НАДО ЭТО ДЕЛАТЬ ПОСРЕДСТВОМ 1С-ЗАПРОСОВ - СЕРВЕР ОБРУШИТЕ.
|
|||
42
Широкий
20.01.14
✎
12:46
|
(41) Никто и не спорит
|
|||
43
WildSery
20.01.14
✎
12:47
|
(41) Ну понятно, что получение значений "дырок" посредством запроса потребует предварительно сгенерированного биллиона записей номеров.
|
|||
44
Широкий
20.01.14
✎
12:50
|
Мой вариант бесполезного занятия:
ВЫБРАТЬ ИсходнаяТаблица.Код+1 КАК НачальныйКод, МИНИМУМ(МестаХранения.Код) - ИсходнаяТаблица.Код - 1 КАК КоличествоПропусков ИЗ (ВЫБРАТЬ МестаХранения.Код КАК Код ИЗ Справочник.МестаХранения КАК МестаХранения ОБЪЕДИНИТЬ ВЫБРАТЬ 0) КАК ИсходнаяТаблица ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.МестаХранения КАК МестаХранения ПО ИсходнаяТаблица.Код < МестаХранения.Код СГРУППИРОВАТЬ ПО ИсходнаяТаблица.Код ИМЕЮЩИЕ МИНИМУМ(МестаХранения.Код) - ИсходнаяТаблица.Код - 1 > 0 УПОРЯДОЧИТЬ ПО НачальныйКод |
|||
45
Лефмихалыч
20.01.14
✎
13:39
|
(44) я ж говорю - соединение с вложенными запросами...
двоешник :) |
|||
46
GANR
20.01.14
✎
13:58
|
(44) Тооочно - хороший запрос.
|
|||
47
GANR
20.01.14
✎
13:59
|
+(46) Если минимальный номер, больший текущего больше чем текущий более, чем на 1, то имеет место дырка.
|
|||
48
МихаилМ
20.01.14
✎
14:03
|
(47)
и как (44) адаптировать для реквизита строка ? |
|||
49
GANR
20.01.14
✎
14:13
|
(48) А про это я пишу в (37), раз ВЫРАЗИТЬ не прокатывает.
|
|||
50
WildSery
20.01.14
✎
14:24
|
(49) И получится многоэтажная белиберда, которую только программно собрать можно.
|
|||
51
bolobol
20.01.14
✎
14:39
|
Нельзя выбрать несуществующее
|
|||
52
WildSery
20.01.14
✎
14:41
|
(51) Ну и что? Можно создать несуществующее, а затем выбрать.
|
|||
53
bolobol
20.01.14
✎
15:17
|
(52) Ожидание результата создания состарит)
|
|||
54
WildSery
20.01.14
✎
15:36
|
(53) Вероятно. Но никак не делает (51) истиной.
|
|||
55
bolobol
20.01.14
✎
19:28
|
(54) Это всё от непонимания и незнания! Создание - это не выборка - это именно создание с исключением. Непонимание здесь. А вот и незнание: вместо создания, дешевле сделать перебор, т.к. операция сравнения гораздо дешевле операции присваивания. Т.о., имея таблицу неугодных, проще и дешевле создать таблицу угодных. А выбрать её - никак. Мать, её, часть учитывайте!
|
|||
56
WildSery
21.01.14
✎
12:43
|
(55) Вы наверное что-то умное написали, но я ничего не понял. Даже возникла мысль, что это какая-то бессвязная чушь.
|
|||
57
WildSery
21.01.14
✎
12:54
|
(48) Михаил, какой же вы упёртый...
Преобразуйте строку к числу запросом, развлекайтесь. выбрать "0" Символ, 0 Цифра поместить СоответствиеСимволЦифра объединить все выбрать "1", 1 объединить все выбрать "2", 2 объединить все выбрать "3", 3 объединить все выбрать "4", 4 объединить все выбрать "5", 5 объединить все выбрать "6", 6 объединить все выбрать "7", 7 объединить все выбрать "8", 8 объединить все выбрать "9", 9; ВЫБРАТЬ 1000000000 + (((((((ССЦ1.Цифра * 10 + ССЦ2.Цифра) * 10 + ССЦ3.Цифра) * 10 + ССЦ4.Цифра) * 10 + ССЦ5.Цифра) * 10 + ССЦ6.Цифра) * 10 + ССЦ7.Цифра) * 10 + ССЦ8.Цифра) * 10 + ССЦ9.Цифра КАК КодЧисло ПОМЕСТИТЬ ВТ1 ИЗ КакаяТоТаблица КАК Таб ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ1 ПО (ССЦ1.Символ = ПОДСТРОКА(Таб.Номер, 2, 1)) ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ2 ПО (ССЦ2.Символ = ПОДСТРОКА(Таб.Номер, 3, 1)) ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ3 ПО (ССЦ3.Символ = ПОДСТРОКА(Таб.Номер, 4, 1)) ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ4 ПО (ССЦ4.Символ = ПОДСТРОКА(Таб.Номер, 5, 1)) ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ5 ПО (ССЦ5.Символ = ПОДСТРОКА(Таб.Номер, 6, 1)) ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ6 ПО (ССЦ6.Символ = ПОДСТРОКА(Таб.Номер, 7, 1)) ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ7 ПО (ССЦ7.Символ = ПОДСТРОКА(Таб.Номер, 8, 1)) ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ8 ПО (ССЦ8.Символ = ПОДСТРОКА(Таб.Номер, 9, 1)) ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ9 ПО (ССЦ9.Символ = ПОДСТРОКА(Таб.Номер, 10, 1)) ; ВЫБРАТЬ Ном1.КодЧисло + 1 КАК Нач, ЕСТЬNULL(МИНИМУМ(Ном2.КодЧисло) - 1, 1999999999) КАК Кон ИЗ ВТ_Номенклатура КАК Ном1 ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Номенклатура КАК Ном2 ПО Ном1.КодЧисло < Ном2.КодЧисло СГРУППИРОВАТЬ ПО Ном1.КодЧисло ИМЕЮЩИЕ Ном1.КодЧисло + 1 < ЕСТЬNULL(МИНИМУМ(Ном2.КодЧисло) - 1, 1999999999) УПОРЯДОЧИТЬ ПО Нач |
|||
58
WildSery
21.01.14
✎
12:56
|
(57) в последнем запросе исправить
ИЗ ВТ1 КАК Ном1 ЛЕВОЕ СОЕДИНЕНИЕ ВТ1 КАК Ном2 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |