LEFT JOIN в запросах ADODB

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

LEFT JOIN в запросах ADODB

Сообщение Leon_ » 07.06.2004 (Пн) 17:47

Помогите разобраться?

Стал заменять запросы к MDB-базе с модели данных DAO 3.6 на ADO 2.5.
Код: Выделить всё
sQuery = "SELECT Field1, Field2 FROM...."
          Set recordset = dbs.OpenRecordset(sQuery, dbOpenSnapshot)

но при прохождении
Код: Выделить всё
recordset.Open sQuery, cnn, adOpenForwardOnly

вылетает ошибка (если кому это что говорит "Run-time error '-2147467259 (80004005)")
Я посчитал, что это проблема связана с тем, что в той SQL-инструкции я использую LEFT JOIN (потому что без JOIN все заработало).
Так в этом ли JOIN'е дело? И если так, то как обходиться без него?

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 08.06.2004 (Вт) 10:17

А синтаксис запроса? Может быть попробовать <left outer join> или <inner join> в зависимости от необходимости?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.06.2004 (Вт) 10:19

JOIN можно вообще не использовать, его вполне возможно заменить условиями в WHERE. LEFT/RIGHT JOIN тоже можно заменить условиями, но их синтаксис зависит от конкретной СУБД, в некоторых это tbl1.key = tbl2.fkey(+), в других иначе.
Lasciate ogni speranza, voi ch'entrate.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 09.06.2004 (Ср) 10:03

:idea: Да, я слышал, что JOIN-конструкции можно эквивалентно заменить WHERE.. Только как это сделать? Меня интересуют как раз варианты для Access и MS SQL Server.
??

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 09.06.2004 (Ср) 12:16

MS SQL поддерживает JOIN'ы и левый, и правый. Приведи строку запроса, скроее всего в ней ошибка.

WHERE формируется просто: все условия из ON переносятся в WHERE

Например, если
Код: Выделить всё
SELECT t1.*
FROM [table_1] t1
    INNER JOIN [table_2] t2
    ON t2.Id = t1.Id AND t2.Name = t1.SubName

то
Код: Выделить всё
SELECT t1.*
FROM [table_1] t1, [table_2] t2
WHERE t1.Id = t2.Id AND t2.Name = t1.SubName

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 09.06.2004 (Ср) 23:25

Да, именно в строке запроса была ошибка, и не в JOIN оказалось дело. Имя одного из запрашиваемых полей было "Section", а в ANSI-92 SQL это теперь резервированное слово. Неожиданный сюрприз.
(Порылся в поиске на Форуме -- "MSDN Q238243" оказалось в самую точку :-))

Но остается такой вопрос -- уже теоретический, раз MS SQL поддерживает все JOIN'ы. Но все же:

а как заменить эквивалентно конструкцию не с INNER JOIN, а RIGHT JOIN (или LEFT)?
(Например: "Отобрать всех авторов и их книги из ТабАвторы, ТабКниги, если НЕ всем авторам соответствуют записи о книгах")

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 11.06.2004 (Пт) 13:39

а как заменить эквивалентно конструкцию не с INNER JOIN, а RIGHT JOIN (или LEFT)?
(Например: "Отобрать всех авторов и их книги из ТабАвторы, ТабКниги, если НЕ всем авторам соответствуют записи о книгах")


Примерно так:

Код: Выделить всё
SELECT A.Автор, K.Книга
FROM ТабАвторы A LEFT JOIN ТабКниги K ON A.АвторID=K.АвторID

' или (устаревший синтаксис, но работает):

SELECT A.Автор, K.Книга
FROM ТабАвторы, ТабКниги K WHERE A.АвторID*=K.АвторID
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 11.06.2004 (Пт) 23:42

:oops: Как все просто, оказывается..
Спасибо. :)


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

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

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

    TopList  
cron