Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Реализация рекурсивного запроса / 16 сообщений из 16, страница 1 из 1
12.01.2016, 17:15
    #39145697
martinet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация рекурсивного запроса
Доброе время суток!
Задача: перебрать всевозможные комбинации значений по полю SIMBOL (по 3 значения из 4-х возможных), сгруппированные по полю ROOM. Пример таблицы исходной и результирующей - в присоединенном архиве базы
...
Рейтинг: 0 / 0
12.01.2016, 17:16
    #39145699
martinet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация рекурсивного запроса
martinet,
...
Рейтинг: 0 / 0
12.01.2016, 17:20
    #39145704
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация рекурсивного запроса
martinetК сообщению приложен файл
Нераспознаваемый формат базы данных.
...
Рейтинг: 0 / 0
12.01.2016, 17:58
    #39145757
martinet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация рекурсивного запроса
...
Рейтинг: 0 / 0
12.01.2016, 18:04
    #39145768
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация рекурсивного запроса
Проще было изобразить то же самое в теге Table...
А теперь поясните, где тут "комбинации". Как был один символ на запись в поле Symbol, так и остался.
...
Рейтинг: 0 / 0
12.01.2016, 18:39
    #39145814
Реализация рекурсивного запроса
martinet, возможно подойдет такой вариант
Код: sql
1.
2.
3.
4.
SELECT T1.Room, T1.Symbol As Symbol1, T2.Symbol As Symbol2, T3.Symbol As Symbol3
FROM (tbl1 As T1 INNER JOIN tbl1 As T2 ON T1.Room=T2.Room And T1.Symbol<T2.Symbol) 
INNER JOIN tbl1 As T3 ON T2.Room=T3.Room And T2.Symbol<T3.Symbol
ORDER BY T1.Room, T1.Symbol, T2.Symbol, T3.Symbol
...
Рейтинг: 0 / 0
12.01.2016, 18:40
    #39145818
martinet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация рекурсивного запроса
Akina,

В таблице tbl1 - исходные данные.
В таблице result - то, что нужно получить из tbl1.
...
Рейтинг: 0 / 0
12.01.2016, 19:08
    #39145839
martinet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация рекурсивного запроса
-Практикант-,

нужно перебрать все возможные комбинации в поле SYMBOL , относящиеся к одной группе ROOM. И получить результат в виде, как в таблице RESULT
...
Рейтинг: 0 / 0
12.01.2016, 19:33
    #39145857
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация рекурсивного запроса
martinet,

IdRoomSymbol1room1A2room1B3room1C4room1D




IdRoomSymbol1room1A2room1B3room1C4room1A5room1B6room1D7room1A8room1C9room1D10room1B11room1C12room1D


практикант
RoomSymbol1Symbol2Symbol3room1ABCroom1ABDroom1ACDroom1BCD
...
Рейтинг: 0 / 0
12.01.2016, 19:51
    #39145871
Реализация рекурсивного запроса
martinet,
Код: sql
1.
2.
3.
4.
5.
6.
SELECT Room, Mid(Symbol3, num,1) As Symbol FROM
(SELECT num FROM tabTri) As Q1,
(SELECT TOP 100 PERCENT T1.Room, T1.Symbol & T2.Symbol & T3.Symbol As Symbol3
FROM (tbl1 As T1 INNER JOIN tbl1 As T2 ON T1.Room=T2.Room And T1.Symbol<T2.Symbol) 
INNER JOIN tbl1 As T3 ON T2.Room=T3.Room And T2.Symbol<T3.Symbol
ORDER BY T1.Room,T1.Symbol & T2.Symbol & T3.Symbol) As Q2


где tabTri таблица из трех записей. Значение поля num первой записи равно 1, второй - 2, третьей - 3.
...
Рейтинг: 0 / 0
12.01.2016, 19:54
    #39145874
martinet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация рекурсивного запроса
tbl1 это исходные данные
result искомый результат запроса.
...
Рейтинг: 0 / 0
12.01.2016, 20:34
    #39145891
Реализация рекурсивного запроса
martinettbl1 это исходные данные
result искомый результат запроса.
Внятно говорите, что не устраивает?
...
Рейтинг: 0 / 0
12.01.2016, 21:12
    #39145908
martinet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация рекурсивного запроса
-Практикант-,

Спасибо большое - то что нужно.
Всем участникам тоже спасибо.
...
Рейтинг: 0 / 0
14.01.2016, 23:23
    #39147809
martinet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация рекурсивного запроса
-Практикант-,
Мне Ваше решение показалось очень изящным :).
Но сначала я задачу представила в очень упрощенном виде. А вот если вместо символов будут слова, как в прилагаемом файле?

Создала следующий запрос :
Код: plaintext
1.
2.
3.
SELECT Q2.Room, Switch([num]=1,Left([Symbol3],InStr(1,[Symbol3],"*")-1),[num]=2,Right(Left([Symbol3],InStr(1,[Symbol3],"|")-1),Len(Left([Symbol3],InStr(1,[Symbol3],"|")-1))-InStr(1,[Symbol3],"*")),[num]=3,Right([Symbol3],Len([Symbol3])-InStr(1,[Symbol3],"|"))) AS Выражение1
FROM (SELECT num FROM tabTri)  AS Q1, (SELECT TOP 100 PERCENT T1.Room, T1.Symbol &'*' &T2.Symbol &'|'& T3.Symbol AS Symbol3 FROM (tbl1 AS T1 INNER JOIN tbl1 AS T2 ON (T1.Symbol<T2.Symbol) AND (T1.Room=T2.Room)) INNER JOIN tbl1 AS T3 ON (T2.Symbol<T3.Symbol) AND (T2.Room=T3.Room) ORDER BY T1.Room, T1.Symbol &'*' &T2.Symbol &'|'& T3.Symbol)  AS Q2;

Но думаю, что есть более правильное решение, чем мое. Подскажите, пожалуйста.
...
Рейтинг: 0 / 0
14.01.2016, 23:24
    #39147810
martinet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация рекурсивного запроса
martinet,
...
Рейтинг: 0 / 0
15.01.2016, 06:21
    #39147855
Реализация рекурсивного запроса
martinetНо думаю, что есть более правильное решение, чем мое. Подскажите, пожалуйста.
Могу предложить такое решение
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT Room, Mid(Symbol3, num1, InStr(num1, Symbol3, "|")-num1) AS Symbol
FROM (SELECT (D2.digit & D1.digit & D0.digit)+1 AS num, num+1 As num1
      FROM Digits AS D0, Digits AS D1, Digits AS D2) AS Q1, 
     (SELECT T1.Room, "|" & T1.Symbol & "|" & T2.Symbol & "|" & T3.Symbol & "|" As Symbol3
      FROM (tbl1 As T1 INNER JOIN tbl1 As T2 ON T1.Room=T2.Room And T1.Symbol<T2.Symbol) 
      INNER JOIN tbl1 As T3 ON T2.Room=T3.Room And T2.Symbol<T3.Symbol) AS Q2
WHERE num<Len(Symbol3) And Mid(Symbol3, num,1)="|"
ORDER BY Room, Symbol3, num


где используется запрос/таблица Digits (см. 5414410 ).
Насколько данное решение "более правильное", то это сугубо индивидуально. А вот сравнить запросы по быстродействию стоит. В данном варианте подзапрос Q1 рассчитан для обработки не более 996 символов, которые суммарно содержатся в поле Symbol трех записей исходной таблицы. Если же их не более 96, то для повышения быстродействия запроса имеет смысл убрать ", Digits AS D2" и "D2.digit & " из подзапроса.

P.S. Сейчас заметил, что перемудрил в своем запросе предыдущего топика. Ваш запрос можно записать в таком виде
Код: sql
1.
2.
3.
4.
5.
SELECT Q2.Room, Switch( ... ) AS Выражение1
FROM tabTri, (SELECT T1.Room, T1.Symbol &'*' &T2.Symbol &'|'& T3.Symbol AS Symbol3 
FROM (tbl1 AS T1 INNER JOIN tbl1 AS T2 ON (T1.Symbol<T2.Symbol) AND (T1.Room=T2.Room)) 
INNER JOIN tbl1 AS T3 ON (T2.Symbol<T3.Symbol) AND (T2.Room=T3.Room)) AS Q2
ORDER BY Room, Symbol3, num
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Реализация рекурсивного запроса / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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