powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / select from
5 сообщений из 5, страница 1 из 1
select from
    #37311495
Ребят, подскажите, пожалуйста, в чем ошибка. Уже голову сломал. Написал элементарный запрос:
SELECT Reevypdlo.dat_vyp, Reevypdlo.sn_lr, Reevypdlo.med, Reevypdlo.kol;
FROM reevypdlo, adlo;
WHERE Reevypdlo.sn_lr <> adlo.recept
Foxpro9 выдает ошибку: file 1111.tmp is too large.
Но, если:
SELECT Reevypdlo.dat_vyp, Reevypdlo.sn_lr, Reevypdlo.med, Reevypdlo.kol;
FROM reevypdlo, adlo;
WHERE Reevypdlo.sn_lr = adlo.recept
то запрос норм получается.
Та же ситуация, если делать через inner join.
...
Рейтинг: 0 / 0
select from
    #37311534
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так ведь ясно же прямо английским языком и написано, что результат получается слишком большим. Системное ограничение FoxPro на таблицы DBF: 1 миллиард записей или 2ГБ объема. Вот по какой-то из этих характеристик и вылетел за границы.

У тебя же условие объединения Reevypdlo.sn_lr <> adlo.recept, что означает, по сути, перемножение количества записей в первой таблицы на количество записей во второй. За небольшим исключением тех записей, коды которых совпадают.

Т.е. если, например, в обоих таблицах по 1 тысяче записей и связь между ними один-к-одному, то в результате условия связи по не равенству в результирующей выборке получим: 1000*1000-1000-1000 = 998000.

Напиши словами, что именно надо получить. Может, подскажут какой именно запрос надо написать без необходимости в декартовом произведении записей.
...
Рейтинг: 0 / 0
select from
    #37311544
Ну нужно выбрать записи из таблицы Reevypdlo, где поле Reevypdlo.sn_lr не равно полю adlo.recept в таблице Reevypdlo. Формат полей одинаковый (c20)
...
Рейтинг: 0 / 0
select from
    #37311561
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОлегОлегОлегНу нужно выбрать записи из таблицы Reevypdlo, где поле Reevypdlo.sn_lr не равно полю adlo.recept в таблице Reevypdlo. Формат полей одинаковый (c20)
Этого недостаточно. Предположим у тебя такие данные

Reevypdlo.sn_lr

AA
BB
CC

adlo.recept

AA
DD
EE

Берем первую запись из таблицы Reevypdlo. Значение AA равно значению в первой записи таблицы adlo, но не равно значению во второй и третьей записи таблицы adlo.

Так вот, надо ли чтобы запись из таблицы Reevypdlo со значение AA вообще не попала в итоговую выборку или попала 2 раза? Ведь ее нет для 2 записей таблицы adlo.

Если интересует первый вариант, то он решается через NOT EXISTS() или NOT IN ()

Код: plaintext
1.
2.
SELECT Reevypdlo.dat_vyp, Reevypdlo.sn_lr, Reevypdlo.med, Reevypdlo.kol ;
FROM reevypdlo ;
WHERE NOT EXISTS(select  1  from adlo WHERE Reevypdlo.sn_lr = adlo.recept)

или так

Код: plaintext
1.
2.
SELECT Reevypdlo.dat_vyp, Reevypdlo.sn_lr, Reevypdlo.med, Reevypdlo.kol ;
FROM reevypdlo ;
WHERE Reevypdlo.sn_lr NOT IN (select adlo.recept from adlo)

С точки зрения производительности оба варианты практически одинаковые. Какой из них выбрать - вопрос личных предпочтений.
...
Рейтинг: 0 / 0
select from
    #37311572
ВладимирМ,

Спасибо большое... Буду читать мат. часть)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / select from
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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