powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Возможен такой запрос?
8 сообщений из 8, страница 1 из 1
Возможен такой запрос?
    #32660449
ethan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеем таблицу с полем id(счетчик) где id имеет шаг +1. На множестве значений id имеются разрывы, 1,2,3,4,22,33,44,45,46,109... Возможно одним запросом, использую jet-sql и максимум vb-встроенные функции получить результат в виде

iMin iMax iHole
4 22 18
22 33 11
33 44 11
46 109 63
и т.д.
...
Рейтинг: 0 / 0
Возможен такой запрос?
    #32660452
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО - нет. Может быть мастера SQL поправят...
...
Рейтинг: 0 / 0
Возможен такой запрос?
    #32660453
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поиск "дырок" в последовательности ключей
/topic/13289

з.ы. Есть многое на свете, друг Горацио... (с) Вильям, понимаете ли наш Шекспир
...
Рейтинг: 0 / 0
Возможен такой запрос?
    #32660716
ethan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не получается чего-то на jetSQL. Прочитал топик по ссылке, спасибо за инфу, на tSQL я бы и сам допер. А вот на jetSQL чего-то не могу.
...
Рейтинг: 0 / 0
Возможен такой запрос?
    #32660833
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ethanНе получается чего-то на jetSQL. Прочитал топик по ссылке, спасибо за инфу, на tSQL я бы и сам допер. А вот на jetSQL чего-то не могу.
И в чем проблема?
Там же прямо в самом верху запрос есть. Вот его и переделай под Акс
т.е. подзапрос сохрани отдельно
будет у тебя 2 запроса - ну и что?

ИЛИ так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select s.key as key_s, e.minkey as key_e
from table as s inner join 
[
 select min(key) minkey
 from table
 where key > start.key
]. as e
on e.key_e > s.key_s +  1 
В чем, так сказать, трудность?
...
Рейтинг: 0 / 0
Возможен такой запрос?
    #32661006
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть несколько путе решения праблы:

1. В лоб.
Нетрудно написать (пишу на своей табличке):
Код: plaintext
1.
2.
3.
SELECT D.CODE, Min(T.CODE) AS Min_CODE , Min([T].[CODE]-[D].[CODE]) AS Delt
FROM DOC AS D INNER JOIN DOC AS T ON D.CODE < T.CODE
GROUP BY D.CODE;
Но на реальном объеме данных это буде считаться до второго пришествия. Причем вывод строк не происходит до полного окончания счета. Я например не дождался ни разу (на ~ несколько десятков тысяч записей в таблице - в произведении перед группировкой порядка миллионов строк).

2. Если написать так (перенести опирацию выбора минимума внутрь строки) :
Код: plaintext
1.
2.
SELECT D.CODE, (Select Min(T.CODE) AS T_CODE  From DOC AS T WHERE D.CODE < T.CODE) AS Next,  Next - D.CODE AS DELT
FROM DOC AS D ;
то вывод строк начнется сразу (не факт, что весь запрос отработает быстрее, но что -то будет сразу видно)

Если нужны только дырки, то:
Код: plaintext
1.
2.
3.
SELECT D.CODE, (Select Min(T.CODE) AS T_CODE  From DOC AS T WHERE D.CODE < T.CODE) AS Next,  Next - D.CODE AS DELT
FROM DOC AS D
WHERE (Select Min(T.CODE) AS T_CODE  From DOC AS T WHERE D.CODE < T.CODE) - D.CODE> 1 ;
Тут уже побыстрее.


3. Можно попытаться реализовать функциональность вложенного запроса самому на VBA примерно так (на другой своей табличке):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Option Compare Database
Option Explicit

Dim rst As DAO.Recordset
Public Function NextC(sTName As String, sIName As String, sFName As String, Code)
 'Static rst As DAO.Recordset 
On Error Resume Next
    If rst.Name <> sTName Then
        Set rst = tDBS.DataDB.OpenRecordset(sTName, dbOpenTable)
    End If
    If rst.Index <> sIName Then
        rst.Index = sIName
    End If
    rst.Seek ">", Code
    If rst.NoMatch Then
        NextC = Null
    Else
        NextC = rst.Collect(sFName)
    End If
End Function
'Тут надо еще заботиться о закрытии rst где-то

И вызывать в запросе:
Код: plaintext
1.
2.
3.
SELECT D.Dogovor_id, T.Dogovor_id, [T].[Dogovor_id]-[D].[Dogovor_id] AS Delta
FROM Dogovor AS D INNER JOIN Dogovor AS T ON NextC("Dogovor","PrimaryKey","Dogovor_id",  D.Dogovor_id) = T.Dogovor_id
WHERE NextC("Dogovor","PrimaryKey","Dogovor_id",  D.Dogovor_id)-[D].[Dogovor_id] > 1 ;
У меня (т.к. нет дырок в пробной на полутора тысячах записей) - открывает пустой набор "махом", А вот на той же табличке что и раньше (в первых 2-х вариантах), я не дождався резалта. (некада, звиняй). Тут можо есче поварьировать (сразу создать массив только "дырочных" кодов, слить в строку с запятыми, и написать In(....). Должно получиться пошустрее (moveNext вместо Seek)...
...
Рейтинг: 0 / 0
Возможен такой запрос?
    #32661158
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
получай фашист гранату
Таблица t с полем id
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT q3.id as start, Min(q4.id) AS end, Min(q4.id)-q3.id as length
FROM (SELECT q1.id
FROM (SELECT Count(t2.id) AS Num, t1.id
FROM t AS t1 INNER JOIN t AS t2 ON t1.id>=t2.id
WHERE (((t1.id)>=t2.id))
GROUP BY t1.id) AS q1, (SELECT Count(t2.id) AS Num, t1.id
FROM t AS t1 INNER JOIN t AS t2 ON t1.id>=t2.id
WHERE (((t1.id)>=t2.id))
GROUP BY t1.id) AS q2
WHERE (((q1.Num)=[q2].[num]- 1 ) AND ((q1.id)<>[q2].[id]- 1 ))) AS q3, (SELECT q1.id
FROM (SELECT Count(t2.id) AS Num, t1.id
FROM t AS t1 INNER JOIN t AS t2 ON t1.id>=t2.id
WHERE (((t1.id)>=t2.id))
GROUP BY t1.id) AS q1, (SELECT Count(t2.id) AS Num, t1.id
FROM t AS t1 INNER JOIN t AS t2 ON t1.id>=t2.id
WHERE (((t1.id)>=t2.id))
GROUP BY t1.id) AS q2
WHERE (((q1.Num)=[q2].[num]+ 1 ) AND ((q1.id)<>[q2].[id]+ 1 ))) AS q4
WHERE (((q4.id)>[q3].[id]))
GROUP BY q3.id;

гыыы
...
Рейтинг: 0 / 0
Возможен такой запрос?
    #32661349
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардоне, брателло.
Инерция мыселюков, плиннн.
Никаких джонов в моем 3. уже и не надь.
Достаточно (в пункте 3., см. выше) так:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT D.CODE,
NextC("DOC","CODE","CODE",D.CODE) AS NextC,
-D.CODE+NextC AS DELT
FROM DOC AS D
WHERE
NextC("DOC","CODE","CODE",D.CODE) -  D.CODE > 1 ;

или, если сразу искать дырки уже в ф-ии NextC:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...
    NextC = Null
    If rst.NoMatch Then
         'NextC = Null 
    Else
        vBuf = rst.Collect(sFName)
        If vBuf > CODE +  1  Then
            NextC = vBuf
        End If
    End If
...
то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT D.CODE,
 NextC("DOC","CODE","CODE",D.CODE) AS NextC,
 -D.CODE+NextC AS DELT
FROM DOCH AS D
WHERE
 Not (NextC("DOC","CODE","CODE",[D].[CODE])) Is Null
;

Считается в весьма приемлемое время. (много шустрее).
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Возможен такой запрос?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]