Подскажите как правильно запрос сформировать

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Никитка Б
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 18.12.2005 (Вс) 9:26

Подскажите как правильно запрос сформировать

Сообщение Никитка Б » 30.04.2006 (Вс) 23:10

Запрос в FoxPro 8.0 работает
Код: Выделить всё
SELECT p.fam+p.im+p.ot from p WHERE p.series+p.number in (SELECT p1.series+p1.number from person as a,p1 WHERE (LIKE ('Т*',a.shifr) AND lEFT(a.spolice,5 )=p1.series   AND left(a.npolice,6)=p1.number ))

После чего я просто копировал результаты запроса в таблицу
Код: Выделить всё
COPY TO c:\никита\p2.dbf


Попытался запустить на VB 6.0 (dao) следующий запрос созданный на основе предыдущего.Вылезает ошибка. пишет "Syntax error in FROM clause"

Код: Выделить всё
SELECT p.fam+p.im+p.ot into p2 in 'C:\sinx'[FoxPro 3.0;database='C:\sinx']  from p in 'C:\sinx'[FoxPro 3.0;database='C:\sinx'] WHERE p.series+p.number in (SELECT p1.series+p1.number from person in 'd:\OMS\OMS\DBLOCAL'[dBASE 5.0;database='d:\OMS\OMS\DBLOCAL'] ,p1 in 'C:\sinx'[FoxPro 3.0;database='C:\sinx'] WHERE (LIKE ('Т*',person.shifr) AND lEFT(person.spolice,5 )=p1.series AND left(person.npolice,6)=p1.number ))


Поэксперементировал с подзапросом, таже самая ошибка. У меня есть версия что не хочет SQL работать с 2-мя таблицами без связи.

Код: Выделить всё
SELECT p1.series+p1.number from person in 'd:\OMS\OMS\DBLOCAL'[dBASE 5.0;database='d:\OMS\OMS\DBLOCAL'] ,p1 in 'C:\sinx'[FoxPro 3.0;database='C:\sinx'] WHERE (LIKE ('Т*',person.shifr) AND lEFT(person.spolice,5 )=p1.series AND left(person.npolice,6)=p1.number )




Помогите найти ошибку. Или понять особенности SQL под VB

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.05.2006 (Пн) 5:54

RTFM
WHERE person.shifr LIKE 'Т*' (dao)
WHERE person.shifr LIKE 'Т%' (ado)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Никитка Б
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 18.12.2005 (Вс) 9:26

Сообщение Никитка Б » 01.05.2006 (Пн) 21:26

НЕ помогло. Мне в принципе то этот Like и не нужен был. Я его просто для ускорения во время разработки включил

сократил запрос до
Код: Выделить всё
SELECT p.fam+p.im+p.ot into p2 in 'C:\sinx'[FoxPro 3.0;database='C:\sinx']  from p in 'C:\sinx'[FoxPro 3.0;database='C:\sinx'] WHERE p.series+p.number in (SELECT p1.series+p1.number from person in 'd:\OMS\OMS\DBLOCAL'[dBASE 5.0;database='d:\OMS\OMS\DBLOCAL'],p1 in 'C:\sinx'[FoxPro 3.0;database='C:\sinx'] WHERE ( (person.spolice )=p1.series AND (person.npolice)=p1.number ))

таже самая ошибка. пути правельные. А возможно что перед этим у меня создается таблица p1. Может vb не успевает её досоздать. Хотя эта таблица на диске создается.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.05.2006 (Вт) 6:50

Ну дык не всё же сразу...
Постепенно, постепенно...

Теперь -
Мануал писал(а):С помощью предложения IN можно одновременно подключиться только к одной внешней базе данных.

Мануал писал(а):Для повышения быстродействия и упрощения применения вместо предложения IN рекомендуется использовать присоединение таблиц.

Потом, там http://bbs.vbstreets.ru/viewtopic.php?p=144094#144094 какой-нибудь, мож поможет...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Никитка Б
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 18.12.2005 (Вс) 9:26

Сообщение Никитка Б » 02.05.2006 (Вт) 17:48

Кстати да. Я просто сделал так. Сначала преобразовал таблицу под один вид(версию) поместил в туже папку, и не много изменил запрос
Код: Выделить всё
sq = "select * into person in 'C:\sinx'[FoxPro 3.0;database='C:\sinx'] from person in '" & pPer & "'[dBASE 5.0;database='" & pPer & "']"
    Debug.Print sq
    P.Database.Execute sq
    Debug.Print Person.Database.RecordsAffected
   
    sq = "SELECT p1.fam+p1.im+p1.ot as Exp_1 into p2 in 'C:\sinx'[FoxPro 3.0;database='C:\sinx'] from person LEFT JOIN p1 ON person.spolice=p1.series AND person.npolice=p1.number in 'C:\sinx'[FoxPro 3.0;database='C:\sinx'] WHERE p1.fam+p1.im+p1.ot is NOT null"
   
    P.Database.Execute sq


Кстати почему Person.Database.RecordsAffected показывает только кол-во обновленных записей(в запросе Update) а в запрсе на создание таблици всегда показывает 0.

Никитка Б
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 18.12.2005 (Вс) 9:26

Сообщение Никитка Б » 02.05.2006 (Вт) 19:46

Теперь еще один вопрос. Написал запрос:
Код: Выделить всё
sq = "SELECT * into p4 in 'C:\sinx'[FoxPro 3.0;database='C:\sinx'] from aaa LEFT JOIN p ON aaa.fam=p.fam AND aaa.im=p.im AND aaa.ot=p.ot AND aaa.birthday=p.birthday WHERE p.pr_akt<>'1'"


На FoxPro он выполняется считанные секунды(1-2), а на VB копм виснет. Процессор в 100% загружен. Ждал 20 минут бестолку, так и не сделал. (база P в районе 100000 записей, база aaa - 600 записей)


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList