Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Подзапрос!!! Очень надо!!!! / 3 сообщений из 3, страница 1 из 1
09.05.2008, 19:18
    #35304056
Beer_Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапрос!!! Очень надо!!!!
Здравствуйте!!! Очень нужна помощь!!!
Имеется БД FoxPro: версия dos-2.6, понятие первичного ключа отсутствует, мне необходимо импортировать из нее данные. Структура той части БД, которая меня интересует представляет собой звезду: есть пять справочников и в шестой таблице (пусть будет "адрес") собраны коды из справочников. Бывают случаи, что в таблице "адрес" встречаются коды, которых нет в справочнике. Соединяюсь с FoxPro через odbc-драйвер из Delphi. Пишу запрос

"select r. name, t2. region, t2.subject from "D:\SPR\streets.dbf" as r RIGHT JOIN(select reg.name as region,sub.name as subject, b_d.street_id
from "D:\SPR\region.dbf" as reg RIGHT JOIN
("D:\DBF\bas_dat.dbf" as b_d LEFT JOIN "D:\SPR\subject.dbf" as sub
ON b_d.subject=sub.kod) ON reg.kod=b_d.region) t2 ON r.kod=t2.street_id;

Выдает ошибку: "[ODBC Visual FoxPro Driver] Syntax error"

Подскажите как быть!!!! Очень срочно надо!!!!
...
Рейтинг: 0 / 0
10.05.2008, 01:04
    #35304211
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапрос!!! Очень надо!!!!
FoxPro вплоть до VFP8 включительно поддерживал подзапросы только и исключительно в директиве WHERE. Подзапросы в директиве FROM или JOIN стали возможны только в VFP9. А драйвер ODBC был написан только для 6 версии. Для VFP9 написан только драйвер OLE DB (ADO).

Соответственно, у Вас два варианта решения:

1) скачать драйвер ADO для 9 версии (можно бесплатно скачать с сайта Microsoft) и использовать его для Ваших запросов
2) изменить сам запрос, чтобы подзапросы были только в директиве WHERE

Собственно, объединение по LEFT/RIGHT JOIN можно симулировать примерно таким запросом

Код: plaintext
1.
2.
3.
SELECT ... FROM tab1 INNER JOIN tab2 ON tab1.id = tab2.id
UNION ALL
SELECT ... FROM tab1 WHERE tab1.id NOT IN (SELECT tab2.id FROM tab2)

Ну, или вместо NOT IN использовать NOT EXISTS(). Без разницы.

Хотя, я не вижу особого смысла вообще во вложенных запросах. Надо меньше пользоваться построителем запросов и больше думать, а что же этот запрос собственно делает. Если перевести это на "человеческий" язык, просто раскрыв все скобки, то получается довольно простая конструкция

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT 
	r.name,
	reg.name as region,
	sub.name as subject
FROM "D:\DBF\bas_dat.dbf" as b_d
LEFT JOIN "D:\SPR\streets.dbf" as r ON b_d.street_id = r.kod
LEFT JOIN "D:\SPR\region.dbf" as reg ON b_d.region = reg.kod
LEFT JOIN "D:\SPR\subject.dbf" as sub ON b_d.subject = sub.kod

Драйвер ODBC от 6 версии должен "проглотить" такой запрос без проблем
...
Рейтинг: 0 / 0
10.05.2008, 10:17
    #35304257
Beer_Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапрос!!! Очень надо!!!!
Большое спасибо, вы меня прямо выручили. А подзапросом я делал, потому что думал, что в Фоксе нельзя одну таблицу связывать внешним соедением с несколькими таблицами (в Oracle так).
Еще раз спасибо!!!!
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Подзапрос!!! Очень надо!!!! / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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