вопрос по выборке

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

вопрос по выборке

Сообщение Sirik » 06.02.2006 (Пн) 12:59

можно ли сделать выборку (SELECT) таким образом:
из базы данных (DB1) из таблицы (T1) выбрать те эл., которых нет в базе данных (DB2) из таблицы (T2); сравнение произвести по 2-м полям?

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

Сообщение GSerg » 06.02.2006 (Пн) 13:09

Код: Выделить всё
SELECT Table1.*
FROM Table1 LEFT JOIN Table2 IN "DB2.mdb" ON Table1.f1=Table2.f1 AND Table1.f2=Table2.f2
WHERE IsNull(Table2.f1) AND IsNull(Table2.f2)

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

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 06.02.2006 (Пн) 14:25

Ммм... Кажется, WHERE надо переписать - OR там более уместен, нежели AND. Впрочем, это уже зависит от того, что именно нужно - если "нет в базе" это когда хотя бы одно поле из двух отличается, тогда да, надо ставить OR.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 06.02.2006 (Пн) 14:29

пишет ошибку синтаксиса: (правда я без Where - поля по-любову не будут пустыми):
Код: Выделить всё
"SELECT RigheOrdini.* FROM [RigheOrdini] LEFT JOIN [tbl_Order] IN """ & Path_Database_Una & Name_Database_Una & """ ON RigheOrdini.NumeroOrdine = tbl_Order.Numberr AND RigheOrdini.NumeroRiga = tbl_Order.Riga ;"

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 06.02.2006 (Пн) 14:33

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

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 06.02.2006 (Пн) 14:40

всё-равно ошибка синтаксиса:
Код: Выделить всё
"SELECT RigheOrdini.* FROM RigheOrdini LEFT JOIN tbl_Order IN """ & Path_Database_Una & Name_Database_Una & """ ON RigheOrdini.NumeroOrdine = tbl_Order.Numberr AND RigheOrdini.NumeroRiga = tbl_Order.Riga WHERE IsNull(tbl_Order.Numberr) AND IsNull(tbl_Order.Riga) ;"

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

Сообщение GSerg » 06.02.2006 (Пн) 14:48

""" & Path_Database_Una & Name_Database_Una & """ - угадай, что это в итоге?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 06.02.2006 (Пн) 14:49

Так и пишет - "ошибка синтаксиса"? Богато, да...
ЕМНИП, в Аксессе нужно условия джойна в скобки брать. Попробуй:
Код: Выделить всё
...
FROM Table1
  LEFT JOIN Table2 IN "DB2.mdb" ON (Table1.f1=Table2.f1)
    AND (Table1.f2=Table2.f2)
...
Возможно, IN тоже нужно в скобки брать, я не знаю.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 06.02.2006 (Пн) 14:54

пишет: Ошибка синтаксиса в предложении FROM

может еще кто-то вмешакться в дискусию кроме Ennor'а ?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 06.02.2006 (Пн) 14:55

GSerg писал(а):""" & Path_Database_Una & Name_Database_Una & """ - угадай, что это в итоге?
Да, бэкслэша может и не быть, в общем случае...

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 06.02.2006 (Пн) 15:01

в смысле, я не понимаю ???

зы. это просто путь к базе данных, см. скрин
У вас нет доступа для просмотра вложений в этом сообщении.

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

Сообщение GSerg » 06.02.2006 (Пн) 16:38

Значит, IN при JOIN на разные базы не допускается.

Значит, сначала прилинковываешь таблицу к базе, а потом этим же запросом, но уже без IN.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 06.02.2006 (Пн) 16:46

а как прилинковать?

зы. не знаю имеет ли значение: ипользую рекорсет dao

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

Сообщение GSerg » 06.02.2006 (Пн) 17:29

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

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

Сообщение VVitafresh » 06.02.2006 (Пн) 17:44

Sirik писал(а):а как прилинковать?

Код: Выделить всё

Public Function LinkTable(sPath1 As String, sPWD1 As String, sLinkTblAs As String, sPath2 As String, sPWD2 As String, sLinkTbl As String) As Boolean
    'Прилинковка таблицы из другой базы Access
    'sPath1, sPWD1 - путь и пароль к базе, в которую нужно прилинковать табл.
    'sLinkTblAs - под каким именем прилинковывать таблицу
    'sPath2, sPWD2 - путь и пароль к базе, в которой находится подсоединяемая табл.
    'sLinkTbl - имя таблицы в этой базе
   
    Dim daoDB As DAO.Database
    Dim daoEng As DAO.DBEngine
    Dim daoWrk As DAO.Workspace
    Dim Tbl As DAO.TableDef

    On Error Resume Next
   
    If Dir(sPath1) = "" Then Exit Function
    If Dir(sPath2) = "" Then Exit Function
   
    Set daoWrk = DAO.CreateWorkspace("my", "admin", "", DAO.dbUseJet)
    Set daoDB = daoWrk.OpenDatabase(sPath1, , , ";UID=sa;PWD=" & sPWD1 & ";")
    If Err.Number <> 0 Then Exit Function
   
    Set Tbl = daoDB.CreateTableDef(sLinkTblAs)
    Tbl.SourceTableName = sLinkTbl
    Tbl.Connect = ";DATABASE=" & sPath2 & ";UID=sa;PWD=" & sPWD2 & ";"
    daoDB.TableDefs.Append Tbl
    If Err.Number <> 0 Then Exit Function
    daoDB.TableDefs.Refresh
   
    LinkTable = Err.Number = 0
    daoDB.Close
End Function

Вызов для базы без пароля:
Код: Выделить всё

Result = LinkTable("c:\db1.mdb", "", "Tbl1", "c:\db2.mdb", "", "Tbl2")
If Result=True Then MsgBox "Всё ОК."
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.


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

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

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

    TopList