Максимальный запрос из [VB] -> [Access]

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

Максимальный запрос из [VB] -> [Access]

Сообщение kibernetics » 02.04.2007 (Пн) 18:07

Скажите пожалуйста какой макс. длины можно создавать запросы из бейсика к мдб?
я хотел было заюзать такой запрос:
Код: Выделить всё
strMainFields = "tbl_Prepares.Subject, tbl_Prepares.Price, tbl_Sellers.seller_name, tbl_Prepares.Phone, tbl_Regions.cityname, tbl_Pictures.picture_id"

        strSplit = "SELECT " & strMainFields & " FROM tbl_Sellers " & _
        "INNER JOIN (tbl_Pictures INNER JOIN (tbl_Regions INNER JOIN (tbl_Groups INNER JOIN tbl_Prepares " & _
        "ON tbl_Groups.group_id=tbl_Prepares.Groupe_id) ON tbl_Regions.city_id=tbl_Prepares.Region_id) " & _
        "ON tbl_Regions.city_id=tbl_Prepares.Region_id) ON tbl_Pictures.picture_id=tbl_Prepares.Picture_id) " & _
        "tbl_Sellers.seller_id=tbl_Prepares.Seller_id;"


но у меня возникает ошибка:
"Не поддерживается выражение объединения"

хотя, если брать данные из двух таблиц, то тогда запрос можно сделать. что же у меня неправильно?

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

Сообщение GSerg » 02.04.2007 (Пн) 18:19

Если оставшийся хвост в лице "tbl_Sellers.seller_id=tbl_Prepares.Seller_id" - это WHERE, то надо так и писать - WHERE :neutral:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 02.04.2007 (Пн) 19:10

да нет..
это не WHERE

Код: Выделить всё
SELECT tbl_Prepares.Subject, tbl_Prepares.Price, tbl_Sellers.seller_name, tbl_Prepares.Phone, tbl_Regions.cityname, tbl_Pictures.picture_id
FROM tbl_Sellers INNER JOIN (tbl_Pictures INNER JOIN (tbl_Regions INNER JOIN (tbl_Groups INNER JOIN tbl_Prepares ON tbl_Groups.group_id=tbl_Prepares.Groupe_id) ON tbl_Regions.city_id=tbl_Prepares.Region_id) ON tbl_Pictures.picture_id=tbl_Prepares.Picture_id) ON tbl_Sellers.seller_id=tbl_Prepares.Seller_id;


вроде так верно.
но просто интересно, вот какой длины запрос всё-таки можно создавать? есть ли ограничение-то?

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

Сообщение GSerg » 02.04.2007 (Пн) 19:22

Есть. Но я сомневаюсь, что ты когда-либо приблизишься к нему.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Сообщение shady » 02.04.2007 (Пн) 19:45

kibernetics писал(а):"Не поддерживается выражение объединения"

А при чем здесь ограничение?
Этот запрос в самом Access работает?
Скорее всего нет.

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

Сообщение skiperski » 03.04.2007 (Вт) 2:27

kibernetics писал(а):но просто интересно, вот какой длины запрос всё-таки можно создавать?

Длина тут вовсе не при чём.

Для начала надо привести к читабельному виду
Код: Выделить всё
SELECT tbl_Prepares.Subject, tbl_Prepares.Price, tbl_Sellers.seller_name, tbl_Prepares.Phone, tbl_Regions.cityname, tbl_Pictures.picture_id
FROM tbl_Sellers
    INNER JOIN (tbl_Pictures
        INNER JOIN (tbl_Regions
            INNER JOIN (tbl_Groups
                INNER JOIN tbl_Prepares
                ON tbl_Groups.group_id=tbl_Prepares.Groupe_id)
            ON tbl_Regions.city_id=tbl_Prepares.Region_id)
        ON tbl_Pictures.picture_id=tbl_Prepares.Picture_id)
    ON tbl_Sellers.seller_id=tbl_Prepares.Seller_id

Сразу же видно, что не хватает открывающей скобки после FROM и закрывающей в конце. Но не в них дело, а в самом выражении. Таблица tbl_Prepares находится на самом глубоком уровне и на более верхних попросту не видна. Надо переписать, например, так:
Код: Выделить всё
SELECT tbl_Prepares.Subject, tbl_Prepares.Price, tbl_Sellers.seller_name, tbl_Prepares.Phone, tbl_Regions.cityname, tbl_Pictures.picture_id
FROM (tbl_Sellers
    INNER JOIN (((tbl_Prepares
        INNER JOIN tbl_Pictures ON tbl_Pictures.picture_id = tbl_Prepares.Picture_id)
        INNER JOIN tbl_Regions  ON tbl_Regions.city_id     = tbl_Prepares.Region_id)
        INNER JOIN tbl_Groups   ON tbl_Groups.group_id     = tbl_Prepares.Groupe_id)
    ON tbl_Sellers.seller_id=tbl_Prepares.Seller_id)

Или ещё лучше вот так:
Код: Выделить всё
SELECT tbl_Prepares.Subject, tbl_Prepares.Price, tbl_Sellers.seller_name, tbl_Prepares.Phone, tbl_Regions.cityname, tbl_Pictures.picture_id
FROM ((((tbl_Prepares
    INNER JOIN tbl_Sellers  ON tbl_Sellers.seller_id   = tbl_Prepares.Seller_id)
    INNER JOIN tbl_Pictures ON tbl_Pictures.picture_id = tbl_Prepares.Picture_id)
    INNER JOIN tbl_Regions  ON tbl_Regions.city_id     = tbl_Prepares.Region_id)
    INNER JOIN tbl_Groups   ON tbl_Groups.group_id     = tbl_Prepares.Groupe_id)

И совсем не понятно зачем связывать с таблицей tbl_Groups -- её значения нигде не используются, и с таблицей tbl_Pictures -- значение поля picture_id есть уже в таблице tbl_Prepares. Тогда запрос сокращается до такого вида:
Код: Выделить всё
SELECT tbl_Prepares.Subject, tbl_Prepares.Price, tbl_Sellers.seller_name, tbl_Prepares.Phone, tbl_Regions.cityname, tbl_Prepares.Picture_id
FROM ((tbl_Prepares
    INNER JOIN tbl_Sellers ON tbl_Sellers.seller_id = tbl_Prepares.Seller_id)
    INNER JOIN tbl_Regions ON tbl_Regions.city_id   = tbl_Prepares.Region_id)

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 03.04.2007 (Вт) 10:54

skiperski
просто бесподобно...
ваш труд уникален. я просто мечтал привести к "читабельному виду".
сам уже ногу сломал, запутался, наделал кучу ошибок.
спасибо большое. занесу к себе в документацию

quote="skiperski"И совсем не понятно зачем связывать с таблицей tbl_Groups -- её значения нигде не используются, и с таблицей tbl_Pictures -- значение поля picture_id есть уже в таблице tbl_Prepares. Тогда запрос сокращается до такого вида:
[/quote]

на самом деле я просто скопировал запрос из акцеса и вставил код в приложение.
но ввиду вашего замечания, вновь пересмотрю "грамотность" создания запроса...

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

Сообщение skiperski » 03.04.2007 (Вт) 14:27

kibernetics писал(а):на самом деле я просто скопировал запрос из акцеса и вставил код в приложение.

Тогда не понятно почему запрос не работал, если он был сгенерирован самим Access'ом.

kibernetics писал(а):но ввиду вашего замечания, вновь пересмотрю "грамотность" создания запроса...

Жёсткие связи могут быть оправданы в том случае, если обязательно должны быть записи в таблицах tbl_Pictures и tbl_Groups. В таком случае будут выбраны только записи гаранированно находящиеся в группе и с картинкой. Но если это не обязательно, то можно и сократить. Или переписать на односторонние джойны, чтобы в случае отсутствия картинки, группы или региона, запись тем не менее попадала в выборку. Но это всё зависит от поставленной задачи и без доп. информации рекомендовать что-либо сложно.

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

Сообщение Andrey Fedorov » 04.04.2007 (Ср) 15:06

А если использовать алиасы, то запрос становится еще компактнее:

Код: Выделить всё
SELECT P.Subject, P.Price, S.seller_name, P.Phone, R.cityname, P.Picture_id
FROM ((tbl_Prepares P
    INNER JOIN tbl_Sellers S ON S.seller_id = P.Seller_id)
    INNER JOIN tbl_Regions R ON R.city_id   = P.Region_id)
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 05.04.2007 (Чт) 14:41

Andrey Fedorov
спасибо. это наверное еще где-то определять нужно алиасы. что такое P., S., и R. ? но в принципе, боюсь пока заморачиваться. когда явно таблица указывается хоть длиннее, но более понятнее.

2ALL
может еще можете ответить на такой вопрос:
1. есть таблица в которой сделаны три поля:
Код: Выделить всё
[group_id as long] - порядковый номер группы
[parent_id as long] - номер принадлежности к номеру группы
[description as text] - текст


к примеру записи:
Код: Выделить всё
1 / 0 / Компьютеры
2 / 0 / Сетевое оборудование
3 / 1 / Винчестер
4 / 2 / Маршрутизатор


означают, что компьютеры и сетевое оборудование это группы.
винчестер - это подгруппа группы компьютеры, т.к. в parent_id = 1.
маршрутизатор - это подгруппа группы сетевое оборудование, т.к. в parent_id = 2

как мне лучше сформировать запрос, для того чтобы набить treeview нодами с поднодами? чтобы получилось примерно следующее:
Код: Выделить всё
Компьютеры
.......|_______Винчестер
Сетевое оборудование
.......|_______Маршрутизатор


пока я делаю это с помощью двух запросов, в первом я беру все записи где parent_id = 0, во втором запросе беру все записи, где parent_id > 0, ну и набиваю tvw.

может это можно сделать одним запросом? а потом при набивке проверять равно ли значение rs.Fields(1).Value = 0 то создавать новый нод, если нет, то помещать в соответствующий нод. в общем, у меня нет опыта в этом, но мне бы хотелось узнать, как бы вы эту задачу решили?

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

Сообщение alibek » 05.04.2007 (Чт) 15:08

Nested Sets
Lasciate ogni speranza, voi ch'entrate.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 15.04.2007 (Вс) 19:10

alibek
а вот нифига и не nested.
nested это типа union?

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 15.04.2007 (Вс) 23:16

kibernetics писал(а):nested это типа union?


Это типа поиск: http://bbs.vbstreets.ru/viewtopic.php?t=28692&highlight=nested+sets
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.


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

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

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

    TopList