Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Возможен такой запрос? / 8 сообщений из 8, страница 1 из 1
23.08.2004, 01:22:15
    #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
23.08.2004, 01:27:44
    #32660452
Темный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен такой запрос?
ИМХО - нет. Может быть мастера SQL поправят...
...
Рейтинг: 0 / 0
23.08.2004, 01:31:16
    #32660453
Темный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен такой запрос?
Поиск "дырок" в последовательности ключей
/topic/13289

з.ы. Есть многое на свете, друг Горацио... (с) Вильям, понимаете ли наш Шекспир
...
Рейтинг: 0 / 0
23.08.2004, 10:23:11
    #32660716
ethan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен такой запрос?
Не получается чего-то на jetSQL. Прочитал топик по ссылке, спасибо за инфу, на tSQL я бы и сам допер. А вот на jetSQL чего-то не могу.
...
Рейтинг: 0 / 0
23.08.2004, 11:34:41
    #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
23.08.2004, 12:58:26
    #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
23.08.2004, 14:01:38
    #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
23.08.2004, 15:09:31
    #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
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Возможен такой запрос? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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