На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
  
> INNER JOIN объединение 3 таблиц , MS Access/ADO
    Написал запрос, объединяющий 3 таблицы INNER JOIN'ом
    ExpandedWrap disabled
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Add('select BL.mkb,MKB.DESCR,SUM(BL.dni) as dni,D.fio,count(*) as kolvo');
        ADOQuery1.SQL.Add('from BolList as BL ');
        ADOQuery1.SQL.Add('INNER JOIN Doctor as D ON BL.doctor=D.key ');
        ADOQuery1.SQL.Add('INNER JOIN MKB ON BL.mkb=mkb.code ');
        ADOQuery1.SQL.Add('where PolStac="'+PolStac+'"');
        ADOQuery1.SQL.Add('and Date>=:d1 and Date<=:d2');
        ADOQuery1.Parameters.ParamByName ('d1').Value:=DateEdit1.Date;
        ADOQuery1.Parameters.ParamByName ('d2').Value:=DateEdit2.Date;
        ADOQuery1.SQL.Add('GROUP BY BL.mkb,D.fio,MKB.DESCR');
        ADOQuery1.Active:=true;

    выдает ошибку: Ошибка синтаксиса(пропущен оператор) в выражении запроса BL.doctor=D.key INNER JOIN MKB ON BL.mkb=mkb.code
    Делаю подобный запрос в SQL-server все работает...

    Может Access не дает объединять больше 2х таблиц?
    Нагуглил похожую проблему http://www.cyberforum.ru/delphi-database/thread13773.html но ее решения там нету...

    Добавлено
    Если сделать все cross join'ом, всмысле через запятую таблицы написать, то все работает
    ExpandedWrap disabled
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Add('select BL.mkb,MKB.DESCR,SUM(BL.dni) as dni,D.fio,count(*) as kolvo');
        ADOQuery1.SQL.Add('from BolList as BL,Doctor as D,MKB');
        ADOQuery1.SQL.Add('where BL.doctor=D.key and BL.mkb=mkb.code and BL.mkb=mkb.code');
        ADOQuery1.SQL.Add('and PolStac="'+PolStac+'"');
        ADOQuery1.SQL.Add('and Date>=:d1 and Date<=:d2');
        ADOQuery1.Parameters.ParamByName ('d1').Value:=DateEdit1.Date;
        ADOQuery1.Parameters.ParamByName ('d2').Value:=DateEdit2.Date;
        ADOQuery1.SQL.Add('GROUP BY BL.mkb,D.fio,MKB.DESCR');
        ADOQuery1.Active:=true;

    Но вопрос про INNER JOIN не снимается, почему в данном случае не работает он?
      ExpandedWrap disabled
         ADOQuery1.SQL.BeginUpdate;
         ADOQuery1.SQL.Clear;
         ADOQuery1.SQL.Add('select BL.mkb,MKB.DESCR,SUM(BL.dni) as dni,D.fio,count(*) as kolvo');
        ...
         ADOQuery1.SQL.Add('GROUP BY BL.mkb,D.fio,MKB.DESCR');
         ADOQuery1.SQL.EndUpdate;
        ...
        Почему бы не использовать неплохой конструктор запросов самого Аксесса, чтобы посмотреть как на самом деле текст запроса должен выглядеть.
        Рекомендуется именно его, т.к. Аксесс формирует селективные запросы, объединяющие данные из нескольких таблиц (кстати, и из 2, 3, 5, 10, и т.д. таблиц) с окаянным количеством вложенных круглых скобок, переплетение которых без пол-литры не разобрать.
        После успешного выполнения сконструированного запроса перенести текст этого запроса в приложение. Будет работать за милую душу. Проверено сотни раз.
          2 sansans, спасибо помогло. Оказывается в синтаксисе Access INNER JOIN берется в скобки
          ExpandedWrap disabled
            SELECT *
            FROM (BolList INNER JOIN doctor ON BolList.Doctor = doctor.key) INNER JOIN mkb ON BolList.mkb = mkb.CODE;
            Хоть трабл был и не в этом, но кто ж добавляет кусок запроса после присваивания параметров
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0.0702 ]   [ 16 queries used ]   [ Generated: 5.05.26, 08:57 GMT ]