"Хитрый" SQL-запрос

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

"Хитрый" SQL-запрос

Сообщение Dummiel » 19.03.2007 (Пн) 17:22

Хай, други мои!

Задачка вот какая встала передо мной, как лист перед травой :) :
Сделать сложную выборку в MSHFlexGrid из нескольких таблиц БД.

"Основная" - паспортные данные (rsIss As New Recordset), 5 таблиц, для каждой своя ... As New Recordset. Каждая из 5-ти таблиц - определенные данные исследований. Одинаковые в этих 5-ти таблицах только номер чела (nBol), дата записи, время записи.

В грид хочу вывести номер, фамилию, инициалы из "основной" таблицы, и данные из остальных таблиц исследований. Учитываем то, что в "основной" таблице может записей не быть (если новая БД), соответственно таблицы исследований тоже пусты. При заполнении "основной" не обязательно заполняются исследования, а при заполнении исследованиями их м.б. несколько на одного чела в одной таблице (и в остальных так же).

Делаю так (отрывок кода):

Код: Выделить всё
sSQL = "SELECT nBol, Fam, Name, Otch FROM Pasp ORDER BY Fam"
rsIss.Open sSQL, cnDB, adOpenStatic, adLockReadOnly

If rsIss.RecordCount <> 0 Then 'если есть записи в "основной" таблице
   ReDim aArr(5, 0) 'инициализируем масив
   
   Do While Not rsIss.EOF

      '****************** до следующего ряда звездочек - код выборки из 1-й таблицы
      sSQL = "SELECT DateIs, TimeIs FROM BAK WHERE BAK.nBol = " & isBol & _
             " ORDER BY DateIs, TimeIs"
     
      rsBAK.Open sSQL, cnDB, adOpenStatic, adLockReadOnly
       
      If rsBAK.RecordCount <> 0 Then 'если есть записи в 1-й таблице исследований
         Do While Not rsBAK.EOF
            aArr(1, j) = Str(isBol)
            aArr(2, j) = rsIss.Fields("Fam") & " " & _
                         IIf(IsNull(rsIss.Fields("Name")), Empty, Left(rsIss.Fields("Name"), 1) & ".") & _
                         IIf(IsNull(rsIss.Fields("Otch")), Empty, Left(rsIss.Fields("Otch"), 1) & ".")
            aArr(3, j) = "БАК" 'в ячейке грида название признака
            aArr(4, j) = rsBAK.Fields("DateIs") 'дата исследования
            aArr(5, j) = rsBAK.Fields("TimeIs") 'время исследования
            rsBAK.MoveNext:    j = j + 1
            ReDim Preserve aArr(5, j) 'переопределяем массив
         Loop
      End If
      rsBAK.Close   
   
      '******************
      'далее еще 4 куска абсолютно идентичных кода выборки для других таблиц,
      'разные только переменные ... As New Recordset    
      '******************

      rsIss.MoveNext
  Loop

End If

'заполняем грид
For i = 0 To j - 1
    MSHFlexGrid1.AddItem aArr(0, i) & vbTab & aArr(1, i) & vbTab & aArr(2, i) & vbTab & _
                         aArr(3, i) & vbTab & aArr(4, i) & vbTab & aArr(5, i)
Next i

rsIss.Close


Код хорошо работает, но... Несмотрибелен он и неизящен! :(

Вопросы:

1. Можно ли всю эту лабуду загнать в один SQL-запрос? Да еще, чтоб в одной ячейке (элемент массива aArr(3, j)) было значение, не относящееся к БД, т.е., название исследования. Если да, то подскажите, как?
2. Возможно ли через SQL-запрос вывести в одной ячейке грида фамилию и ИНИЦИАЛЫ чела (они в разных полях БД), да еще чтоб после каждого инициала стояла точка? Т.е., взять 1-ю букву поля (типа Left()).

На 1. чувствую, есть положительное решение, просто не знаю, как реализовать. На 2. - не уверен, но не удивлюсь! :)

С уважением - Dummiel.

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

Re: "Хитрый" SQL-запрос

Сообщение VVitafresh » 19.03.2007 (Пн) 21:21

1. Для связи таблиц можно использовать JOIN. В твоем случае, наверное, лучше подойдет LEFT JOIN:
Код: Выделить всё
SELECT Table1.*, Table2.*, Table3.*
FROM (Table1 LEFT JOIN Table2 ON Table1.nBol=Table2.nBol) LEFT JOIN Table3 ON Table1.nBol=Table3.nBol

2.Какая БД? В Access есть Left(), в Transact-SQL SUBSTRING(). Поля склеивают через "плюс", напр.:
Код: Выделить всё
Fam+' '+LEFT(name,1)+'.'+LEFT(otch,1)+'.'
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

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

Сообщение Dummiel » 20.03.2007 (Вт) 15:21

Понял, будем мороковать... :)
Работаю с Access 2000


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

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

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

    TopList