Помогите составить SQL-запрос

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Dummiel
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 11.06.2004 (Пт) 9:15
Откуда: Алтай

Помогите составить SQL-запрос

Сообщение Dummiel » 06.01.2007 (Сб) 4:58

Хай, други!

По многочисленным советам перехожу с DAO на ADO, дык таперя вон чо:

Имеем в папке Base две БД *.mdb: db1, db2.

db1 - рабочая, паспортные данные и прочая лабуда, касающаяся "чиста конкретного" человека.
db2 - "статическая", содержит список признаков, который нет смысла заносить отдельной таблицей в db1, т.к. он
не обновляется - раз заполнили, хватит. В db2 14,5 тыс. записей, и ни к чему "статической" информацией неоправданно
раздувать db1.

Задача: составить SQL-запрос для заполнения DataGrid данными из db1 и db2.

В db1 имеем (полей много, опишу нужные):
Field(x).Name = Fam (фамилия, текстовое, 25 символов)
Field(y).Name = Kod (код признака, текстовое, 5 символов)

В db2 (остальные поля так же не описаны):
Field(1).Name = Kod (код признака, текстовое, 5 символов)
Field(2).Name = KodName (название признака, текстовое, 255 символов)

В поле db1.Field("Kod") внесено значение db2.Field("Kod"), а в DataGrid нужно отразить название признака (значение поля KodName). Сами понимаете, что в db1 лучше вносить 5 символов кода признака, чем раздувать ее названием самого признака из 255 символов.

С одной БД и несколькими таблицами, с DAO-подходом понятно:

sSQL = "SELECT Table1.Fam, Table2.KodName FROM Table1, Table2 WHERE Table1.Kod = Table2.Kod"

Еще говорили, что можно прилинковать таблицу из db2, и работать с ней, как с таблицей из db1. Соответственно, вопрос - как прилинковать, каким методом? М.б., примерчик покажете?

А вот с "двумями" БД и ADO не знаю :(. Я понимаю, надо создавать два коннекшена, и с ними уже выделываться? Или как-то не так?

Просветите, please.

Dummiel
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 11.06.2004 (Пт) 9:15
Откуда: Алтай

Сообщение Dummiel » 06.01.2007 (Сб) 11:02

Кстати, только что нашел, как прилинковать таблицу из другой БД с DAO-подходом:

Код: Выделить всё
ConnectOutput dbsTemp, "TableTemp", ";DATABASE=C:\GRD\db2.mdb", "MKB10"

Sub ConnectOutput(dbsTemp As Database, strTable As String, _
                  strConnect As String, strSourceTable As String)

    Dim tdfLinked As TableDef
    Dim rstLinked As Recordset
    Dim intTemp As Integer

    Set tdfLinked = dbsTemp.CreateTableDef(strTable)

    tdfLinked.Connect = strConnect
    tdfLinked.SourceTableName = strSourceTable

    dbsTemp.TableDefs.Append tdfLinked
    Set dbRS = dbsTemp.OpenRecordset(strTable)

    ..........  кусок кода ............

    dbsTemp.TableDefs.Delete strTable
End Sub


Соответственно вопросик: При создании ссылки на другую таблицу в основной БД создается только ссылочка на таблицу второй БД, или из второй БД в первую переносится вся таблица второй БД? Т.е., размер первой БД существенно не меняется, и быстродействие программы тоже?

В двух словах подтвердите/опровергните мои догадки, please!!!

PS. А вот с ADO так и не нашел :(

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

Сообщение Andrey Fedorov » 06.01.2007 (Сб) 12:20

Можно и без линковки - см. в Help-e предложение IN
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение VVitafresh » 06.01.2007 (Сб) 13:11

Можно, конечно, и через IN выбирать из др. базы, но ИМХО все же удобнее линковать.

Dummiel писал(а):Соответственно вопросик: При создании ссылки на другую таблицу в основной БД создается только ссылочка ...

PS. А вот с ADO так и не нашел :(

Размер базы не увеличивается, создается только ссылка.

Пример прилинковки:
Код: Выделить всё
Public Function LinkJetTable(sDestPath As String, sDestPWD As String, sLinkTblAs As String, sSourcePath As String, sSourcePWD As String, sLinkTbl As String) As Boolean
'Прилинковка таблицы из другой базы Access
    'sDestPath, sDestPWD - путь и пароль к базе, в которую нужно прилинковать табл.
    'sLinkTblAs - под каким именем прилинковывать таблицу
    'sSourcePath, sSourcePWD - путь и пароль к базе, в которой находится подсоединяемая табл.
    'sLinkTbl - имя таблицы в этой базе
    Dim cat As New ADOX.Catalog
    Dim tbl As New ADOX.Table
    On Error Resume Next
   ' Open the catalog
    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
      "Data Source=" & sDestPath & ";Jet OLEDB:Database Password=" & sDestPWD
    If Err.Number <> 0 Then Exit Function
    ' Set the name and target catalog for the table
    tbl.Name = sLinkTblAs
    Set tbl.ParentCatalog = cat
    ' Set the properties to create the link
    tbl.Properties("Jet OLEDB:Create Link") = True
    tbl.Properties("Jet OLEDB:Link Datasource") = sSourcePath
    tbl.Properties("Jet OLEDB:Link Provider String") = ";Pwd=" & sSourcePWD & ";"
    tbl.Properties("Jet OLEDB:Remote Table Name") = sLinkTbl
    ' Append the table to the collection
    cat.Tables.Append tbl
    If Err.Number = 0 Then LinkJetTable = True
    Set tbl = Nothing
    Set cat = Nothing
End Function

или
http://bbs.vbstreets.ru/viewtopic.php?p=144094#144094
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Dummiel
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 11.06.2004 (Пт) 9:15
Откуда: Алтай

Сообщение Dummiel » 10.01.2007 (Ср) 5:09

Мозги сломаешь, которых и так мало! :)
Спасибо, будем пробовать.


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

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

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

    TopList