помогите оценить правильность SQL запроса

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
moshkin
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 03.12.2002 (Вт) 15:01
Откуда: Russia

помогите оценить правильность SQL запроса

Сообщение moshkin » 25.05.2005 (Ср) 7:01

Помогите разобраться с SQL запросом:

Если коротко - в запросе можно делать select ... select ... select. То есть можно делать запрос на запросе на запросе?

Если подробно - VB6.0 Sp6, база файл mdb. Построили запрос. Вроде все правильно, но ругается "ошибка синтаксиса в операции JOIN".
В чем дело? Просто ошиблись где-то или нельзя столько вложенных запросов делать?
Сам запрос:
SELECT q1.fNT, q1.fDolg FROM ([SELECT tblNT.fNT, tblDolg.fKodUpload, tblDolg.fDolg FROM tblNT INNER JOIN tblDolg ON tblNT.fNT = tblDolg.fNT Where tblDolg.fKodUpload = 22] . as INNER JOIN [SELECT tblNT.fNT, q21.fNT FROM tblNT LEFT JOIN [SELECT tblRing.fNT, tblRing.fRingResult, tblRing.fSO, tblRing.fRingDateTime1 FROM tblRing WHERE tblRing.fRingResult Like '__________1___' AND tblRing.fSO='1' AND tblRing.fRingDateTime1>=#5/1/2005# And tblRing.fRingDateTime1<=#5/31/2005#]. AS q21 ON tblNT.fNT =q21.fNT WHERE q21.fNT Is Null ] . as ON q1.fNT = q2.tblNT.fNT) INNER JOIN [ SELECT tblNT.fNT, Last(tblRing.fRingResult) AS [Last-fRingResult], tblRing.fSO, Last(tblRing.fRingDateTime1) AS [Last-fRingDateTime1] FROM tblNT LEFT JOIN tblRing ON tblNT.fNT = tblRing.fNT GROUP BY tblNT.fNT, tblRing.fSO HAVING Last(tblRing.fRingDateTime1)<#5/24/2005 10:30:0#] . as q3 ON q2.tblNT.fNT = q3.fNT ORDER BY q1.fDolg DESC

Запрос состоит из трех вложенных. Каждый вложенный по отдельности работает. Все вместе нет. Отбираем все записи которые есть в каждом из трех. Второй вложенный запрос тоже имеет свой внутренний запрос. Без него может и надо но мозгов не хватает обойтись одним. Там отбираем записи которые или удовлетворяют условию, или если в связной таблице нет записей.
И еще - в чем смысл квадратных скобок включающих запрос и точки после внутреннего запроса?
Спасибо.

snov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 28.11.2003 (Пт) 10:12
Откуда: Челябинск

Re: помогите оценить правильность SQL запроса

Сообщение snov » 25.05.2005 (Ср) 7:42

moshkin писал(а):Помогите разобраться с SQL запросом:
У тебя вроде ошибка с синтаксисом * JOIN. они должны связываться по какому-нибудь полю.

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

Сообщение alibek » 25.05.2005 (Ср) 7:45

Запрос у тебя совершенно в нечитабельном виде.

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

Да и смысла квадратных скобок я не понял. По идее, надо так: (select ...) as result1 inner join (select ...) as result2 on result1.field1 = result2.field2
Lasciate ogni speranza, voi ch'entrate.

moshkin
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 03.12.2002 (Вт) 15:01
Откуда: Russia

Сообщение moshkin » 25.05.2005 (Ср) 8:27

Опыта совсем нет, потому и не понятно.
Мы делаем так:
strSQL = "SELECT q1.fNT ... все вот это большое выражение"
rst2.Open strSQL, cnn, adOpenKeyset, adLockReadOnly

А как надо?
Единственно что приходит в голову это
написать
strSQL1="первый внутренний запрос"
strSQL2="второй внутренний запрос"
strSQL3="третий внутренний запрос "
а потом strSQL = "select q1. ... from (" & strsql1 & ") as q1 inner join (" & strsql2 & ") as q2 on q1.field1=q2.field2....."
Но это вроде не то.
Как это правильно пишется? Как вообще работать с такими запросами?
Что такое сохраненый запрос? Где его сохраняют и как это описывается в коде?

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

Сообщение alibek » 25.05.2005 (Ср) 8:33

Нет, rst.Open "select * from qSQL1".
В qSQL1 записано что-то типа "select ... from qSQL2".
В qSQL2 записано что-то типа "select ... from qSQL2".
В qSQL3 записано что-то типа "select ... from ...".
Lasciate ogni speranza, voi ch'entrate.

moshkin
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 03.12.2002 (Вт) 15:01
Откуда: Russia

Сообщение moshkin » 25.05.2005 (Ср) 8:53

Хе.
определили 3 запроса
strSQL1 -3
и написали
strSQL = "SELECT q1.fNT, q1.fDolg FROM ((" & strsql1 & ") as q1 INNER JOIN (" & _
strsql2 & ") as q2 ON q1.fNT = q2.tblNT.fNT) INNER JOIN (" & strsql3 & ") as q3 " & _
"ON q2.tblNT.fNT = q3.fNT"
заработало.
Но как ЭТО правильно делать? Или так тоже нормально?
Спасибо всем и как всегда большое товарищу Alibek.
Буду искать почитать про хранимые запросы.

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

Сообщение alibek » 25.05.2005 (Ср) 9:01

Да так тоже нормально, но лучше все-же сохранить эти запросы в БД -- их будет проще анализировать и отлаживать при необходимости.
Lasciate ogni speranza, voi ch'entrate.

moshkin
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 03.12.2002 (Вт) 15:01
Откуда: Russia

Сообщение moshkin » 25.05.2005 (Ср) 9:24

в акцессе мы их пробуем, а хранить в нем нельзя (или мы не умеем :) ).,Потому что много параметров задается из VB. Все даты и время в третьем запросе, kodUpload, и строковое выражение для Like.

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

Сообщение alibek » 25.05.2005 (Ср) 9:39

Для параметров.

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

PARAMETERS [Arg1] Long, [Arg2] Text ( 255 ), [Arg3] Date;
SELECT *
FROM TABLE1
WHERE [Field1] = [Arg1] AND (([Field2] LIKE [Arg2]) OR IsNull([Arg2])) AND [Field3] >= [Arg3];


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

Dim cmd As ADODB.Command
...
Set cmd = New ADODB.Command
cmd.CommandText = "QUERY1"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Append cmd.CreateParameter("Arg1", adInteger, adParamInput, , 123)
cmd.Parameters.Append cmd.CreateParameter("Arg2", adBSTR, adParamInput, , "A%")
cmd.Parameters.Append cmd.CreateParameter("Arg2", adDate, adParamInput, , Now())
Set cmd.ActiveConnection = <connection>
With cmd.Execute()
  Do Until (.BOF Or .EOF)
    Debug.Print .Fields(0)
    .MoveNext
  Loop
  .Close
End With
Set cmd = Nothing


Текст SQL-запроса можно писать непосредственно в cmd.CommandText (только тогда надо указать cmd.CommandType = adCmdText)
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 165

    TopList