powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / SQL-Request: Help Me!
2 сообщений из 2, страница 1 из 1
SQL-Request: Help Me!
    #32452168
Alexey U
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению собственных знаний и мозгов на решение проблемы просто не хватает.
Помогите, пожалуйста, если сможете - задача состоит в написании сложного SQL-запроса для Access (пишу под VB через DAO).

Есть таблица SONGS (список песен, с неповтаряющимися ID):
ID, AuthorID, Title, Lenght, Catalog и ещё ряд второстепенных данных.

Таблица HISTORY (History прокрутки, т.е. ID повторяются):
ID, Time

Вопрос в том, как составить запрос, который будет рачитывать какую из песен можно использовать следующей, чтобы она сответствовала требованию, например Catalog = "Dance" и в тоже время не была использована в каком-то промежутке времени. Запросов по времени может быть одновременно несколько. К тому же и Author должен быть выбран такой, который не использовался в каком-то временном промежутке.

Я написал запрос, который исправно работает, но он состоит из нескольких вложенных подзапросов. А запросов этих составляется штук 100 подряд, и если history большое то расчитываться это около получаса!

Мой запрос приблизительно такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT * FROM songs 
WHERE catalog= "Dance"  AND ... AND
AND
ID NOT IN (
	SELECT id FROM history
	WHERE time BETWEEN <time1> AND <time2>)
AND
ID NOT IN (
	SELECT author FROM history
	WHERE time BETWEEN <time3> AND <time4>)

Хорошо бы ещё выбирать ту песню которая не использовалась вобще или использовалась давно. Но если я добавляю сортировку, то тормоза становятся совсем жуткими.

Может быть нужно зделать временную таблицу? Только хорошо бы делать её один раз, а потом по ней прогонять все 100 запросов. Что можете посоветовать?
...
Рейтинг: 0 / 0
SQL-Request: Help Me!
    #32452178
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT * FROM songs 
WHERE catalog= "Dance"  AND ... AND
AND
ID NOT IN (
SELECT id FROM history
WHERE 
(time BETWEEN <time11> AND <time12>) or 
(time BETWEEN <time21> AND <time22>) or 
(time BETWEEN <time31> AND <time32>))


или возможно будет быстрее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT * FROM songs 
WHERE catalog= "Dance"  AND ... AND
AND
NOT exist (
SELECT id FROM history
WHERE 
history.id = songs.id and
((time BETWEEN <time11> AND <time12>) or 
(time BETWEEN <time21> AND <time22>) or 
(time BETWEEN <time31> AND <time32>)))


или

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT * 
FROM songs left join
(SELECT distinct id FROM history
WHERE 
(time BETWEEN <time11> AND <time12>) or 
(time BETWEEN <time21> AND <time22>) or 
(time BETWEEN <time31> AND <time32>)) as a
a.id = songs.id and
WHERE catalog= "Dance"  AND ... AND
a.id is null


Так примерно. Все условия можно собрать в один подчиненный запрос, и "NOT IN" в акцессе лучше не пользоваться - медленный он
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / SQL-Request: Help Me!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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