powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Покиньте идею по SQL-запросу
3 сообщений из 3, страница 1 из 1
Покиньте идею по SQL-запросу
    #38829593
Eaglerus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго вечера всем!

Помогите с запросом.
Вроде всё просто, но что-то не лезет ничего в голову.

Есть некая таблица с номерами. Скажем таблица Table1 с полем InvNum C(18).
Есть таблица/курсор TInclude с полем NumMask C(18), куда динамически записывается перечень масок номеров, которые должны попасть в выборку. Маски в формате команды SQL LIKE.
Есть таблица/курсор TExclude с полем NumMask C(18), куда динамически записывается перечень масок номеров, которые не должны попасть в выборку.

В результирующую выборку должны попасть все записи из Table1, которые удовлетворяют маскам из TInclude и одновременно не удовлетворяют ни одной из масок из TExclude.

Вот пример:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
CLOSE TABLES ALL

CREATE CURSOR Table1 (InvNum C(18))
INSERT INTO Table1 (InvNum) VALUES ("98400159TD32081014")
INSERT INTO Table1 (InvNum) VALUES ("99400242TX72581014")
INSERT INTO Table1 (InvNum) VALUES ("99400233AS88876516")
INSERT INTO Table1 (InvNum) VALUES ("97400115TD35481022")
INSERT INTO Table1 (InvNum) VALUES ("99400238DD72589314")

CREATE CURSOR TInclude (NumMask C(18))
INSERT INTO TInclude (NumMask) VALUES ("98%")
INSERT INTO TInclude (NumMask) VALUES ("99___23%")

SELECT a.InvNum FROM Table1 a, TInclude b ;
	WHERE a.InvNum LIKE ALLTRIM(b.NumMask) ;
	INTO CURSOR curResult1
-- результат 3 записи (1-я, 3-я и 5-я), что и требовалось
CREATE CURSOR TExclude (NumMask C(18))
INSERT INTO TExclude (NumMask) VALUES ("%810__")
INSERT INTO TExclude (NumMask) VALUES ("________DD%")

-- вот так выбирает 4 записи
-- что не есть правильно
-- что собственно и ожидалось от такого запроса:
-- для каждого совпадения по маске включения
-- проверяется каждая маска исключения по-отдельности
SELECT a.InvNum FROM Table1 a, TInclude b, TExclude c ;
	WHERE a.InvNum LIKE ALLTRIM(b.NumMask) ;
		AND a.InvNum NOT LIKE ALLTRIM(c.NumMask) ;
	INTO CURSOR curResult2

-- вот так правильно работает
-- в выборке 1 запись
SELECT a.InvNum FROM Table1 a, TInclude b ;
	WHERE a.InvNum LIKE ALLTRIM(b.NumMask) ;
		AND a.InvNum NOT IN ;
		( ;
		 SELECT a2.InvNum ;
		 	FROM Table1 a2, TExclude c ;
		 	WHERE a2.InvNum LIKE ALLTRIM(c.NumMask) ;
		) ;
	INTO CURSOR curResult3

-- смущает вероятная скорость работы такого запроса
-- на таблице под миллион записей
-- с масками включения/исключения с кол-вом условий порядка сотен

CANCEL



Вроде понятно изложил ;)

Подкиньте идею...
Как еще можно подобный запрос забацать?
...
Рейтинг: 0 / 0
Покиньте идею по SQL-запросу
    #38829600
Eaglerus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Eaglerus,

Блин пропустил буковку в названии темы.
А как исправить, не знаю :(
...
Рейтинг: 0 / 0
Покиньте идею по SQL-запросу
    #38829758
Jura.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EaglerusДоброго вечера всем!
-- вот так выбирает 4 записи
-- что не есть правильно
-- что собственно и ожидалось от такого запроса:
-- для каждого совпадения по маске включения
-- проверяется каждая маска исключения по-отдельности
SELECT a.InvNum FROM Table1 a, TInclude b, TExclude c ;
WHERE a.InvNum LIKE ALLTRIM(b.NumMask) ;
AND a.InvNum NOT LIKE ALLTRIM(c.NumMask) ;
INTO CURSOR curResult2


Т.к. в результат выбирается только одно поле что мешает сделать
Код: sql
1.
2.
3.
4.
5.
SELECT a.InvNum FROM Table1 a, TInclude b, TExclude c ;
	WHERE a.InvNum LIKE ALLTRIM(b.NumMask) ;
		AND a.InvNum NOT LIKE ALLTRIM(c.NumMask) ;
GROUP BY 1 ;
	INTO CURSOR curResult2


или
Код: sql
1.
2.
3.
4.
5.
SELECT DISTINCT a.InvNum FROM Table1 a, TInclude b, TExclude c ;
	WHERE a.InvNum LIKE ALLTRIM(b.NumMask) ;
		AND a.InvNum NOT LIKE ALLTRIM(c.NumMask) ;
GROUP BY 1
	INTO CURSOR curResult2
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Покиньте идею по SQL-запросу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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