Ошибка синтаксиса пропущен оператор inner join

imfrozen

0 / 0 / 1

Регистрация: 14.05.2012

Сообщений: 55

1

11.06.2016, 18:34. Показов 6794. Ответов 2

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день.Пытаюсь сделать запрос на соединение таблиц,но получаю ошибку: Ошибка синтаксиса (пропущен оператор) в выражении запроса ‘nazv_otpFROM privoz_gruz INNER JOIN korabli ON privoz_gruz.id_ship = korabli.id_shipINNER JOIN port_otp ON privoz_gruz.port_otp = port_otp.id_port_otpr’.

SQL
1
SELECT id_privoz_gruz,nazvanie,data_prib,nazv_otp,sotrudnik FROM( privoz_gruz INNER JOIN korabli ON privoz_gruz.id_ship = korabli.id_ship) INNER JOIN port_otp ON privoz_gruz.port_otp = port_otp.id_port_otpr INNER JOIN sotrudniki ON privoz_gruz.sotrudniki.id_sotrudniki

Думаю что проблема в расставлении скобок.Подскажите пожалуйста



0



ltv_1953

Эксперт MS Access

17250 / 7091 / 1595

Регистрация: 21.06.2012

Сообщений: 13,335

12.06.2016, 08:07

2

Лучший ответ Сообщение было отмечено imfrozen как решение

Решение

Если это Аксесс (согласно теме, а не разделу). то FROM примерно так (в приведенном запросе и скобок не хватает, и в конце какая-то каша …)

SQL
1
2
3
FROM ((privoz_gruz INNER JOIN korabli ON privoz_gruz.id_ship = korabli.id_ship) 
INNER JOIN port_otp ON privoz_gruz.port_otp = port_otp.id_port_otpr) 
INNER JOIN sotrudniki ON privoz_gruz.sotrudniki = sotrudniki.id_sotrudniki



1



0 / 0 / 1

Регистрация: 14.05.2012

Сообщений: 55

12.06.2016, 09:17

 [ТС]

3

действительно, промахнулся с разделом, извиняюсь
спасибо за помощь



0



Syntax Error (missing Operator) in query expression ‘tbl_employee.emp_id = tbl_netpay.emp_id INNER JOIN tbl_gross ON tbl_employee.emp_id = tbl_gross.emp_ID INNER JOIN tbl_tax ON tbl_employee.emp_id — tbl_tax.emp_ID’.

SELECT tbl_employee.emp_ID,
tbl_employee.emp_name,
tbl_gross.BasicSalary,
tbl_gross.totalOT,
tbl_netpay.totalGross,
tbl_tax.totalLate,
tbl_tax.allowance,
tbl_tax.SSS,
tbl_tax.PhilHealth,
tbl_tax.GSIS,
tbl_tax.HDMF,
tbl_netpay.totalDeduc,
tbl_netpay.emp_ti,
tbl_netpay.emp_wt,
tbl_netpay.emp_np
FROM  tbl_employee
INNER JOIN tbl_netpay ON tbl_employee.emp_id = tbl_netpay.emp_id
INNER JOIN tbl_gross ON tbl_employee.emp_id = tbl_gross.emp_ID
INNER JOIN tbl_tax ON tbl_employee.emp_id = tbl_tax.emp_ID;

I always get the error above.

imfrozen

0 / 0 / 1

Регистрация: 14.05.2012

Сообщений: 55

1

11.06.2016, 18:34. Показов 6159. Ответов 2

Метки нет (Все метки)


Добрый день.Пытаюсь сделать запрос на соединение таблиц,но получаю ошибку: Ошибка синтаксиса (пропущен оператор) в выражении запроса ‘nazv_otpFROM privoz_gruz INNER JOIN korabli ON privoz_gruz.id_ship = korabli.id_shipINNER JOIN port_otp ON privoz_gruz.port_otp = port_otp.id_port_otpr’.

SQL
1
SELECT id_privoz_gruz,nazvanie,data_prib,nazv_otp,sotrudnik FROM( privoz_gruz INNER JOIN korabli ON privoz_gruz.id_ship = korabli.id_ship) INNER JOIN port_otp ON privoz_gruz.port_otp = port_otp.id_port_otpr INNER JOIN sotrudniki ON privoz_gruz.sotrudniki.id_sotrudniki

Думаю что проблема в расставлении скобок.Подскажите пожалуйста

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

ltv_1953

Эксперт MS Access

16778 / 6959 / 1548

Регистрация: 21.06.2012

Сообщений: 12,975

12.06.2016, 08:07

2

Лучший ответ Сообщение было отмечено imfrozen как решение

Решение

Если это Аксесс (согласно теме, а не разделу). то FROM примерно так (в приведенном запросе и скобок не хватает, и в конце какая-то каша …)

SQL
1
2
3
FROM ((privoz_gruz INNER JOIN korabli ON privoz_gruz.id_ship = korabli.id_ship) 
INNER JOIN port_otp ON privoz_gruz.port_otp = port_otp.id_port_otpr) 
INNER JOIN sotrudniki ON privoz_gruz.sotrudniki = sotrudniki.id_sotrudniki

1

0 / 0 / 1

Регистрация: 14.05.2012

Сообщений: 55

12.06.2016, 09:17

 [ТС]

3

действительно, промахнулся с разделом, извиняюсь
спасибо за помощь

0

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    >
    INNER JOIN объединение 3 таблиц
    , MS Access/ADO

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    31.10.12, 12:00

      Junior

      *

      Рейтинг (т): 1

      Написал запрос, объединяющий 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 но ее решения там нету…

      Добавлено 31.10.12, 12:13
      Если сделать все 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 не снимается, почему в данном случае не работает он?


      Gonarh



      Сообщ.
      #2

      ,
      31.10.12, 14:56

        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;


        sansans



        Сообщ.
        #3

        ,
        31.10.12, 18:18

          Почему бы не использовать неплохой конструктор запросов самого Аксесса, чтобы посмотреть как на самом деле текст запроса должен выглядеть.
          Рекомендуется именно его, т.к. Аксесс формирует селективные запросы, объединяющие данные из нескольких таблиц (кстати, и из 2, 3, 5, 10, и т.д. таблиц) с окаянным количеством вложенных круглых скобок, переплетение которых без пол-литры не разобрать.
          После успешного выполнения сконструированного запроса перенести текст этого запроса в приложение. Будет работать за милую душу. Проверено сотни раз.


          int 21h



          Сообщ.
          #4

          ,
          01.11.12, 05:37

            Junior

            *

            Рейтинг (т): 1

            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;


            Fr0sT



            Сообщ.
            #5

            ,
            01.11.12, 06:31

              Хоть трабл был и не в этом, но кто ж добавляет кусок запроса после присваивания параметров

              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

              0 пользователей:

              • Предыдущая тема
              • Delphi: Базы данных
              • Следующая тема

              Рейтинг@Mail.ru

              [ Script execution time: 0,1050 ]   [ 16 queries used ]   [ Generated: 30.01.23, 16:30 GMT ]  

                

              dsultan

              14.04.08 — 16:48

              подключаюсь к dbf через microsoft.jet

              запутался в joinах, вот что выдает

              Ошибка синтаксиса (пропущен оператор) в выражении запроса ‘ttl.ACCID = accs.ID INNER JOIN 1SACCS AS accs2 ON accs.SCHKOD >= accs2.SCHKOD’.

              если убрать второй джойн — не ругается

              где собака?

              SELECT ttl.ACCID AS schet, ttl.CURRID AS valut,

              iif(ttl.VSC0 = ‘ EL’,ttl.SC0,iif(ttl.VSC1 = ‘ EL’,ttl.SC1,

              iif(ttl.VSC2 = ‘ EL’,ttl.SC2,0))) AS sk1, iif(KIND = ‘1’,ttl.SD

              ,0) AS sumost, iif(KIND = ‘2’,ttl.SD,0) AS valsumost,

              iif(KIND = ‘3’,ttl.SD,0) AS kolost

              FROM 1SBKTTL AS ttl

              INNER JOIN

              1SACCS AS accs ON ttl.ACCID = accs.ID

              INNER JOIN

              1SACCS AS accs2 ON accs.SCHKOD >= accs2.SCHKOD AND LEFT(accs.SCHKOD,LEN(accs2.SCHKOD)) = accs2.SCHKOD

              AND accs.PLANID = 809 AND accs2.ID = ‘ 1V ‘

              WHERE (ttl.date = #1/1/2008#) AND (ttl.KIND IN (‘1’, ‘2’, ‘3’)) AND (‘ EL’ IN (ttl.VSC0,

              ttl.VSC1, ttl.VSC2))

                

              sapphire

              1 — 14.04.08 — 16:54

              Попробуй, если ты используешь INNER JOIN
              использовать select … from {перечень таблиц} where {условие выборки} AND {условия соединений}

                

              sapphire

              2 — 14.04.08 — 16:56

              SELECT ttl.ACCID AS schet, ttl.CURRID AS valut,

              iif(ttl.VSC0 = ‘ EL’,ttl.SC0,iif(ttl.VSC1 = ‘ EL’,ttl.SC1,
              iif(ttl.VSC2 = ‘ EL’,ttl.SC2,0))) AS sk1, iif(KIND = ‘1’,ttl.SD
              ,0) AS sumost, iif(KIND = ‘2’,ttl.SD,0) AS valsumost,
              iif(KIND = ‘3’,ttl.SD,0) AS kolost
              FROM 1SBKTTL AS ttl,  1SACCS AS accs, 1SACCS AS accs2
              WHERE
              ((ttl.date = #1/1/2008#) AND (ttl.KIND IN (‘1’, ‘2’, ‘3’)) AND (‘ EL’ IN (ttl.VSC0,
              ttl.VSC1, ttl.VSC2)))
              AND
              (
              accs ON ttl.ACCID = accs.ID AND accs.SCHKOD >= accs2.SCHKOD AND LEFT(accs.SCHKOD,LEN(accs2.SCHKOD)) = accs2.SCHKOD
              AND accs.PLANID = 809 AND accs2.ID = ‘ 1V ‘
              )

                

              dsultan

              3 — 14.04.08 — 17:21

              (2) пустоту вернул :(

                

              sapphire

              4 — 14.04.08 — 17:31

              (3) Если положение dbf-ок статично, можно создать mdbшник и прилепить к нему через связь с таблицами запрос внутри. Так делают, когда хотят уйти от ограничений ядра jet

                

              dsultan

              5 — 14.04.08 — 17:35

              все ок, спасибо, при копипасте пробелы в ‘ 1v ‘ потерялись, и еще заодно узнал, что planID в dbf лежит 36ричный, а в sql версии десятичный

                

              sapphire

              6 — 14.04.08 — 17:36

              (5) :)

                

              dsultan

              7 — 14.04.08 — 17:37

              (4) я так и делаю для дебага, удобно в акцесе проверять
              одно смущает — тот же самый запрос через тот же джет акцес выдает результат мгновенно, а прога отбирает что то долго

                

              sapphire

              8 — 14.04.08 — 17:37

              +(4) Иногда лучше использовать драйвер FoxPro (см документацию к 1С++),
              или через Access. Кстати, частенько Accessовские БД используют для диагностики.

                

              sapphire

              9 — 14.04.08 — 17:38

              (7) Правильно, потому что ты не используешь индексы.

                

              dsultan

              10 — 14.04.08 — 17:39

              (8) я и начал с фокспрошного драйвера, уперся в форматы дат, устал бодаться, решил  джет попробовать

                

              dsultan

              11 — 14.04.08 — 17:41

              а их можно через джет использовать?

                

              КонецЦикла

              12 — 14.04.08 — 17:47

              (10) Юзай ОлеДБ, 1С++ и поиск
              Хватит долбить

                

              КонецЦикла

              13 — 14.04.08 — 17:48

              Кроме того уже есть аккаунтрекордсет

                

              dsultan

              14 — 14.04.08 — 18:07

              (12)а чем джет не оледб?
              делал уже через 1с++, быстрые итоги, все супер, только оказалось, что с dbf они не работают

              самому переписывать быстрые итоги под dbf что то влом
              спрофайлил то, что они запрашивают, пытаюсь приладить

              (13) это к чему?


              Форум программистов Vingrad

              > 2 Join-а в Query, не проходит запрос в IDE 

              :(

              Опции темы

              eXcoder

              Новичок

              Профиль
              Группа: Участник
              Сообщений: 16
              Регистрация: 26.2.2006

              Репутация: нет
              Всего: нет

              День добрый. Работаю через ADO с DBF’ами.
              Объединяю 3 таблицы.

              Пишу в ADOQuery.SQL :

              Код

              SELECT DISTINCT arc_acc.TNUM, arc_acc.SUM
              FROM arc_acc
              LEFT OUTER JOIN cardspri ON arc_acc.TNUM = cardspri.TNUM
              LEFT OUTER JOIN Licschet ON Licschet.xFIO = (cardspri.FAM+" "+cardspri.NAME+" "+cardspri.PATR)
              WHERE (arc_acc.CPERIOD='2005.12') AND ((arc_acc.INOUT='306') OR (arc_acc.INOUT='307'))
              ORDER BY arc_acc.TNUM

              в SQL Suery Analyzer от SQL SERVER 2000
              все проходит на ура.

              IDE говорит, что:
              «
              Ошибка синтаксиса (пропущен оператор) в выражении запроса ‘arc_acc.TNUM = cardspri.TNUM
              LEFT OUTER JOIN Licschet ON Licschet.xFIO = (cardspri.FAM+» «+cardspri.NAME+» «+cardspri.PATR)’

              «

              Как выйти из ситуации?

              Это сообщение отредактировал(а) eXcoder — 1.3.2006, 06:04

              SergeBS

              Эксперт
              ***

              Профиль
              Группа: Завсегдатай
              Сообщений: 1111
              Регистрация: 10.6.2005
              Где: Владимир

              Репутация: 11
              Всего: 22

              Апострофы посмотри — в Delphi надо удваивать, т.е.
              SQL
              select * where a = ‘blabla-bla’ and b = 1

              В IDE:
              var
              s : string;

              s := ‘select * where a = »blabla-bla» and b = 1’;
              И так же — в Query и т.п.

              CaNIBaLchik

              Новичок

              Профиль
              Группа: Участник
              Сообщений: 48
              Регистрация: 8.2.2006
              Где: Томск

              Репутация: нет
              Всего: нет

              join -ы они вообще раздувают кортежы, любои join можно заменить and — ом

              eXcoder

              Новичок

              Профиль
              Группа: Участник
              Сообщений: 16
              Регистрация: 26.2.2006

              Репутация: нет
              Всего: нет

              Цитата(CaNIBaLchik @ 1.3.2006, 11:55 Найти цитируемый пост)
              join -ы они вообще раздувают кортежы, любои join можно заменить and — ом

              Можешь показать на моем запросе как вместо JOIN юзать AND ? smile

              SergeBS

              Эксперт
              ***

              Профиль
              Группа: Завсегдатай
              Сообщений: 1111
              Регистрация: 10.6.2005
              Где: Владимир

              Репутация: 11
              Всего: 22

              CaNIBaLchik,

              Цитата
              join -ы они вообще раздувают кортежы, любои join можно заменить and — ом

              Шутник.

              eXcoder,
              Вдогонку:
              ParamCheck -> false
              Prepared -> false

              ТоляМБА

              Котэ
              ***

              Профиль
              Группа: Завсегдатай
              Сообщений: 1607
              Регистрация: 15.12.2004
              Где: Трансильвания

              Репутация: 3
              Всего: 252

              Была у меня похожая проблема – 3 таблицы и два джоина. Не знаю поможет в твоем случае или нет, но всё же.
              Есть у меня в MS-SQL Server три таблицы:

              Liter, LiterLang, Landg
              LiterID,———-LiterID, LangName
              LiterName, LangID,—————-LangID

              Надеюсь так структура понятна.

              Был запрос:

              Код

              SELECT Landg.LangName, Liter.LiterName
              FROM  LiterLang INNER JOIN
              Liter ON LiterLang.LiterID = Liter.LiterID INNER JOIN
              Landg ON LiterLang.LangID = Landg.LangID

              Прокатывал на ура.
              Импортнул в dBase IV. В Делфях ошибка:

              Ошибка синтаксиса (пропущен оператор) в выражении запроса ‘LiterLang.LiterID = Liter.LiterID INNER JOIN
              Landg ON LiterLang.LangID = Landg.LangID’

              Мои действия:
              1. Создал пустую базу Access
              2. Импортнул в нее все таблы
              3. Вставил в неё этот же запрос – оппа, тоже самое сообщение об ошибке. Ну, думаю, а какже акцесс-то связывает свои таблы? Захожу в схему данных и создаю связи (см. выше) перед этим поставив ключевые поля в Liter и в Lang. Захожу в запросы «Создание запроса в режиме конструктора», добавляю все три таблы – все связи сразу показались, помечаю соотв. поля на вывод, жму на просмотр – выдает те же данные что и на MS-SQL Server! С замиранием жму на «Режим SQL» — вижу запрос:

              Код

              SELECT Landg.LangName, Liter.LiterName
              FROM Liter INNER JOIN (Landg INNER JOIN LiterLang ON Landg.LangID = LiterLang.LangID) ON Liter.LiterID = LiterLang.LiterID;

              Цепляю его, ложу в ADOQuery1. Открываю – всё работает.

              Vit

              Vitaly Nevzorov
              ****

              Профиль
              Группа: Экс. модератор
              Сообщений: 10964
              Регистрация: 25.3.2002
              Где: Chicago

              Репутация: 14
              Всего: 207

              Заменить двойные кавычки на одинарные, но удвоенные

              ———————

              With the best wishes, Vit
              I have done so much with so little for so long that I am now qualified to do anything with nothing
              Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru



















              Правила форума «Delphi: Базы данных и репортинг»
              Vit
              Петрович

              Запрещено:

              1. Публиковать ссылки на вскрытые компоненты

              2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

              Обязательно указание:

              1. Базы данных (Paradox, Oracle и т.п.)

              2. Способа доступа (ADO, BDE и т.д.)

              • Литературу по Дельфи обсуждаем здесь
              • Действия модераторов можно обсудить здесь
              • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
              • Вопросы по реализации алгоритмов рассматриваются здесь
              • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи
              • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

              FAQ раздела лежит здесь!


              Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

              0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
              0 Пользователей:
              « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »

              Вопрос:

              Я выполняю задание на класс, и я нахожусь на своем конце. В принципе, мне нужно написать запрос, который использует INNER JOIN для объединения всех данных в 4 таблицы, избегая при этом заголовков с одинаковыми именами (Ie Table1.Master_Number и Table2.Master_Number). Литературные инструкции заключаются в следующем:

              Шаг 1. Создайте представление обо всех столбцах (только один раз столбцы столбцов, если столбцы дублируются в таблицах) во всех таблицах базы данных лекций 5. Сохраните этот запрос как Lecture_5_View и нам этот запрос, чтобы построить следующие 3 запроса. В предложении “FROM” вы должны использовать “INNER JOIN” в этом запросе. Помните, что ACCESS не поддерживает команду “CREATE VIEW”, поэтому вы должны создать запрос выбора. ‘

              Вот скриншот базы данных, в которой показаны все заголовки и заголовки столбцов. Tables

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

              (т.е. ошибка синтаксиса (отсутствующий оператор) в выражении запроса “Таблица1.Master_Number = Таблица2.Master_Number INNER JOIN Table4 ON Table1.Master_Number = Table4.Master_Number)

              SELECT *
              FROM Table1
              INNER JOIN Table2 ON Table1.Master_Number = Table2.Master_Number
              INNER JOIN Table4 ON Table1.Master_Number = Table4.Master_Number
              

              Где я буду ошибаться до сих пор и как выполнить этот запрос?

              Большое спасибо, Джош

              Лучший ответ:

              При использовании Access вам необходимо использовать круглые скобки при выполнении нескольких соединений:

              SELECT  * 
              FROM    (Table1 
                      INNER JOIN Table2 
                          ON Table1.Master_Number = Table2.Master_Number)
                      INNER JOIN Table4 
                          ON Table1.Master_Number = Table4.Master_Number;
              

              Это очень важно, если вы разделите свой запрос так, чтобы у вас было не более одного соединения в каждом разделе, т.е. Ваш первый запрос:

              SELECT  *
              FROM    Table1
                      INNER JOIN Table2
                          ON Table1.Master_Number = Table2.Master_Number;
              

              Тогда у вас есть:

              SELECT  *
              FROM    YourFirstQuery
                      INNER JOIN Table4 
                          ON Table1.Master_Number = Table4.Master_Number;
              

              Это немного отличается от подзапросов, поскольку вы все еще можете ссылаться на все поля из Таблицы 1 и Таблицы2.


              РЕДАКТИРОВАТЬ

              Чтобы избежать дублирования столбцов, вам нужно явно указать нужные столбцы (хотя вы все равно должны это делать):

              SELECT  Table1.Master_Number,
                      Table1.Asset_Tag,
                      Table1.Serial_Number,
                      Table2.Last_Name,
                      Table2.First_Name,
                      Table4.Office_Number,
                      Table4.Location,
                      Table4.Department
              FROM    (Table1 
                      INNER JOIN Table2 
                          ON Table1.Master_Number = Table2.Master_Number)
                      INNER JOIN Table4 
                          ON Table1.Master_Number = Table4.Master_Number;
              

              Ответ №1

              Попробуй это:

                SELECT * FROM ((Table1
              INNER JOIN Table2
              ON Table1.Master_Number = Table2.Master_Number)
              INNER JOIN Table4
              ON Table1.Master_Number = Table4.Master_Number)
              

              Сообщество Программистов

              Загрузка…

                msm.ru

                Нравится ресурс?

                Помоги проекту!

                >
                INNER JOIN объединение 3 таблиц
                , MS Access/ADO

                • Подписаться на тему
                • Сообщить другу
                • Скачать/распечатать тему



                Сообщ.
                #1

                ,
                31.10.12, 12:00

                  Junior

                  *

                  Рейтинг (т): 1

                  Написал запрос, объединяющий 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 но ее решения там нету…

                  Добавлено 31.10.12, 12:13
                  Если сделать все 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 не снимается, почему в данном случае не работает он?


                  Gonarh



                  Сообщ.
                  #2

                  ,
                  31.10.12, 14:56

                    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;


                    sansans



                    Сообщ.
                    #3

                    ,
                    31.10.12, 18:18

                      Почему бы не использовать неплохой конструктор запросов самого Аксесса, чтобы посмотреть как на самом деле текст запроса должен выглядеть.
                      Рекомендуется именно его, т.к. Аксесс формирует селективные запросы, объединяющие данные из нескольких таблиц (кстати, и из 2, 3, 5, 10, и т.д. таблиц) с окаянным количеством вложенных круглых скобок, переплетение которых без пол-литры не разобрать.
                      После успешного выполнения сконструированного запроса перенести текст этого запроса в приложение. Будет работать за милую душу. Проверено сотни раз.


                      int 21h



                      Сообщ.
                      #4

                      ,
                      01.11.12, 05:37

                        Junior

                        *

                        Рейтинг (т): 1

                        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;


                        Fr0sT



                        Сообщ.
                        #5

                        ,
                        01.11.12, 06:31

                          Хоть трабл был и не в этом, но кто ж добавляет кусок запроса после присваивания параметров

                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                          0 пользователей:

                          • Предыдущая тема
                          • Delphi: Базы данных
                          • Следующая тема

                          Рейтинг@Mail.ru

                          [ Script execution time: 0,0536 ]   [ 16 queries used ]   [ Generated: 25.06.23, 08:18 GMT ]  

                        • Ошибка синтаксиса примерное положение group
                        • Ошибка синтаксиса примерное положение where
                        • Ошибка синтаксиса примерное положение from
                        • Ошибка синтаксиса примерное положение foreign
                        • Ошибка синтаксиса примерное положение drop