Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Запрос через несколько таблиц  [new]
anton6
Member

Откуда:
Сообщений: 80
Всем привет, никак не могу освоить запрос через несколько таблиц с джоинами... ужас какой-то...

Самолеты
-----------
samoletid
markasamoletid


Марка
-------
markasamoletid
markasamoletname


Пилоты
--------
pilotid
pilotname


Вылеты
---------
samoletid
pilotid
vuletid
vuletdate



Нужно найти id вылета(vuletid), совершенного пилотом (pilotname) например, Василий
на самолете марки, например, Боинг."

Найти, когда каждый pilotid совершил свой первый вылет
и последний вылет и на каком самолете


Подскажите, пожалуйста, как это сделать....
23 дек 18, 18:31    [21771509]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
Swa111
Member

Откуда:
Сообщений: 84
anton6,

Так как ни каких наработок нет, то исходим из того что мат часть не учим.

для начала постройте широкую таблицу ((начаиная с Вылетов соединенные с Пилотами) соединенные с Самолетами) соединенный с Маркой

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

С поиском первых и последних записей немного сложнее
23 дек 18, 19:26    [21771530]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
anton6
Member

Откуда:
Сообщений: 80
Мат часть смотрел) Второй день)

sq = "SELECT * from [Pilots$] inner join [Vulet$] on [Pilots$].PilotId = [Vulet$].PilotId where Name1 like 'Petrov' "


Как к этой строке подсоединиться еще через пару таблиц... не знаю
Думаю, но никак не додумаю...
24 дек 18, 09:25    [21771759]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18580
anton6, начните с более простого варианта. Просто сначала перечисляем используемые таблицы, а потом условия соответствия записей в них. Типа

SELECT *
FROM таблица1, таблица2, таблица3, ... таблицаN
WHERE таблица1. поле11 = таблица2.поле21
  AND таблица2.поле22 = таблица3.поле31
...
  AND таблицаМ.полеМ2 = таблицаN.полеN1


Так получите все поля всех таблиц (с кучей дублирований, конечно).

Теперь начинайте, видя этот массив и понимая, что надо выбрать, добавлять дополнительные условия отборов. Типа

SELECT *
FROM таблица1, таблица2, таблица3, ... таблицаN
WHERE таблица1. поле11 = таблица2.поле21
  AND таблица2.поле22 = таблица3.поле31
...
  AND таблицаМ.полеМ2 = таблицаN.полеN1

  AND таблицаК.полеК3 = 'некое значение'
  AND таблицаН.полеН5 NOT IN ('значение1', 'значение2')
...

Каждый раз, добавляя очередное условие, проверяйте, соответствует ли результат тому, что ожидалось, не осталось ли что-то, что очередное условие должно было убрать, не убралось ли то, что должно было остаться...

Именно это имелось в виду, когда были сказаны фразы

Swa111
для начала постройте широкую таблицу ((начиная с Вылетов соединенные с Пилотами) соединенные с Самолетами) соединенный с Маркой

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


Как превратить всё это в джойн-синтаксис - это другой вопрос. Но он возникнет именно потом, когда с конвертацией простейшей логики в запрос с картезианским объединением перестанет представлять проблему.
\
24 дек 18, 09:43    [21771769]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5597
anton6,
А Вы уверены,что схема БД разработана верно?
Лично у меня сомнения по поводу таблиц "самолеты" и "марки"-каково их назначение и какие данные в них хранятся?
При правильно спроектированной базе (с установлением связей) создание запроса,хоть из десятка таблиц, в конструкторе не вызывает ни малейших сложностей
24 дек 18, 11:16    [21771830]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4848
sdku
anton6,
А Вы уверены,что схема БД разработана верно?
Лично у меня сомнения по поводу таблиц "самолеты" и "марки"-каково их назначение и какие данные в них хранятся?
При правильно спроектированной базе (с установлением связей) создание запроса,хоть из десятка таблиц, в конструкторе не вызывает ни малейших сложностей


да все нормально там со схемой.
24 дек 18, 11:23    [21771838]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5597
Вдогонку:и вообще обычно работают с экипажами,которые состоят из нескольких человек и как исключение экипажи бывают сборными,но это надо предусматривать.+далеко не каждый пилот может летать на конкретной марке самолета. Короче:если Вы создаете что-то серьезное учитывайте все возможные нюансы,а если же хотите узнать про объединения читайте HELP-там все написано (вряд-ли в рамках форума Вам это объяснят лучше чем вдумчиво прочесть)
Если хотите изложите задачу,стоящую перед Вами, и выложите свои наработки
24 дек 18, 11:29    [21771843]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4848
sdku
Вдогонку:и вообще обычно работают с экипажами,которые состоят из нескольких человек и как исключение экипажи бывают сборными,но это надо предусматривать.+далеко не каждый пилот может летать на конкретной марке самолета. Короче:если Вы создаете что-то серьезное учитывайте все возможные нюансы,а если же хотите узнать про объединения читайте HELP-там все написано (вряд-ли в рамках форума Вам это объяснят лучше чем вдумчиво прочесть)
Если хотите изложите задачу,стоящую перед Вами, и выложите свои наработки


дык парень для люфтганзы разрабатывает.
24 дек 18, 11:33    [21771847]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
anton6
Member

Откуда:
Сообщений: 80
Так, что - то получилось, не подсказывайте)
24 дек 18, 12:13    [21771890]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5597
посмотрите:(для определения первого и последнего вылета в тбл."вылеты" должно быть поле с данными о дате и времени вылета)

К сообщению приложен файл (tmp.rar - 21Kb) cкачать
24 дек 18, 12:27    [21771910]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
anton6
Member

Откуда:
Сообщений: 80
Все...все перегуглил... нашел синтаксис для vba
через одну таблицу запрос сделал, через две никак...
Подскажите, пожалуйста, где неточности


Это работает
sb = "SELECT [Pilots$].PilotID, [Samoletlist$].samoletId, [Samolets$].SamoletsId, [Samolets$].SamoletmarkaId " _
& "FROM ([Pilots$]" _
& "inner JOIN [Samoletlist$] ON [Pilots$].PilotID = [Samoletlist$].PilotID)" _
& "inner JOIN [Samolets$] ON [Samoletlist$].samoletId = [Samolets$].SamoletsId" _
& "Where Name like 'Вася'"

А это уже нет...
sb = "SELECT [Pilots$].PilotID, [Samoletlist$].samoletId, [Samolets$].SamoletsId, [Samolets$].SamoletmarkaId, [SamoletMarka$].SamoletMarkaName " _
& "FROM ([Pilots$]" _
& "inner JOIN [Samoletlist$] ON [Pilots$].PilotID = [Samoletlist$].PilotID)" _
& "inner JOIN [Samolets$] ON [Samoletlist$].samoletId = [Samolets$].SamoletsId" _
'& "inner JOIN [SamoletMarka$] ON [Samolets$].SamoletmarkaId= [SamoletMarka$].SamoletmarkaId " _
& "Where Name like 'Вася'"

И так и так скобки ставил... не получается... прошу помочь
24 дек 18, 13:51    [21772033]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
anton6
Member

Откуда:
Сообщений: 80
Все...все перегуглил... нашел синтаксис для vba
через одну таблицу запрос сделал, через две никак...
Подскажите, пожалуйста, где неточности


Это работает
sb = "SELECT [Pilots$].PilotID, [Samoletlist$].samoletId, [Samolets$].SamoletsId, [Samolets$].SamoletmarkaId " _
& "FROM ([Pilots$]" _
& "inner JOIN [Samoletlist$] ON [Pilots$].PilotID = [Samoletlist$].PilotID)" _
& "inner JOIN [Samolets$] ON [Samoletlist$].samoletId = [Samolets$].SamoletsId" _
& "Where Name like 'Вася'"

А это уже нет...
sb = "SELECT [Pilots$].PilotID, [Samoletlist$].samoletId, [Samolets$].SamoletsId, [Samolets$].SamoletmarkaId, [SamoletMarka$].SamoletMarkaName  " _
& "FROM ([Pilots$]" _
& "inner JOIN [Samoletlist$] ON [Pilots$].PilotID = [Samoletlist$].PilotID)" _
& "inner JOIN [Samolets$] ON [Samoletlist$].samoletId = [Samolets$].SamoletsId" _
'& "inner JOIN [SamoletMarka$] ON [Samolets$].SamoletmarkaId= [SamoletMarka$].SamoletmarkaId " _
& "Where Name like 'Вася'"


И так и так скобки ставил... не получается... прошу помочь
24 дек 18, 13:51    [21772035]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4848
anton6,

скобок не хватает ()
24 дек 18, 13:54    [21772041]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4848
sb = "SELECT [Pilots$].PilotID, [Samoletlist$].samoletId, [Samolets$].SamoletsId, [Samolets$].SamoletmarkaId, [SamoletMarka$].SamoletMarkaName " _
& "FROM (([Pilots$]" _
& "inner JOIN [Samoletlist$] ON [Pilots$].PilotID = [Samoletlist$].PilotID)" _
& "inner JOIN [Samolets$] ON [Samoletlist$].samoletId = [Samolets$].SamoletsId)" _
'& "inner JOIN [SamoletMarka$] ON [Samolets$].SamoletmarkaId= [SamoletMarka$].SamoletmarkaId " _
& "Where Name like 'Вася'"
24 дек 18, 13:54    [21772042]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4408
anton6,

у вас ошибка синтаксиса в первую очередь

попробуйте так. без строк продолжения(не забывайте пробел в начале под-строки)
sb = "SELECT [Pilots$].PilotID, [Samoletlist$].samoletId, [Samolets$].SamoletsId, [Samolets$].SamoletmarkaId," 
sb=sb & " [SamoletMarka$].SamoletMarkaName  " 
sb=sb & " FROM ([Pilots$]" 
sb=sb & "  inner JOIN [Samoletlist$] ON [Pilots$].PilotID = [Samoletlist$].PilotID)" 
sb=sb & " inner JOIN [Samolets$] ON [Samoletlist$].samoletId = [Samolets$].SamoletsId"
'sb=sb & " inner JOIN [SamoletMarka$] ON [Samolets$].SamoletmarkaId= [SamoletMarka$].SamoletmarkaId " 
sb=sb & " Where Name like 'Вася'"


хотя я не уверена, что вы правильно прописали inner JOIN,т.к. явно не хватает скобок
24 дек 18, 14:01    [21772063]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
anton6
Member

Откуда:
Сообщений: 80
Скобки пробовал, но все равно что-то идет не так

Сложный синтаксис...
24 дек 18, 14:12    [21772082]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4408
anton6,
выложите пример базы --не создавать же пример за вас(всеж 4 таблицы)
24 дек 18, 14:18    [21772097]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4408
а пока на примере SDQU
КодВпилотмаркатипдата вылетадата прилета
1КоляАН-24турбовинтовой01.12.201802.12.2018
2ВасяА-320турбореактивный02.12.201803.12.2018
3ПетяXian МА-700турбовинтовой05.12.201806.12.2018
4АнтонА-320турбореактивный04.12.201806.12.2018


автор
Нужно найти id вылета(vuletid), совершенного пилотом (pilotname) например, Василий
на самолете марки, например, Боинг."


SELECT вылеты.КодВ
FROM типы
 INNER JOIN (пилоты
 INNER JOIN (марка
 INNER JOIN вылеты
 ON марка.КодМ = вылеты.марка)
 ON пилоты.КодП = вылеты.пилот)
 ON типы.КодТ = вылеты.тип
WHERE (((пилоты.пилот) Like "вася*") AND ((марка.марка) Like "*320"));


получим ответ=2

сравните скобки вашего примера и этого
24 дек 18, 14:33    [21772127]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
Serg197311
Member

Откуда:
Сообщений: 362
anton6
И так и так скобки ставил... не получается... прошу помочь

Вот заморочился то.... Я через конструктор делаю, он сам все скобки как надо расставляет...
24 дек 18, 14:37    [21772132]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4408
anton6,


добавила записей
КодВпилотмаркатипдата вылетадата прилета
1КоляАН-24турбовинтовой01.12.201802.12.2018
2ВасяА-320турбореактивный02.12.201803.12.2018
3ПетяXian МА-700турбовинтовой05.12.201806.12.2018
4АнтонА-320турбореактивный04.12.201806.12.2018
5КоляАН-24турбовинтовой01.11.201802.12.2018
6ВасяА-320турбореактивный02.11.201803.12.2018
7ПетяXian МА-700турбовинтовой05.11.201806.12.2018
8АнтонА-320турбореактивный04.11.201806.12.2018
9КоляАН-24турбовинтовой01.10.201802.12.2018
10ВасяА-320турбореактивный02.10.201803.12.2018
11ПетяXian МА-700турбовинтовой05.10.201806.12.2018
12АнтонА-320турбореактивный04.10.201806.12.2018



автор
Найти, когда каждый pilotid совершил свой первый вылет и последний вылет и на каком самолете

зап2
SELECT пилоты.пилот,
 Min(вылеты.[дата вылета]) AS [Min-дата вылета],
 Max(вылеты.[дата вылета]) AS [Max-дата вылета]
FROM типы
 INNER JOIN (пилоты
 INNER JOIN (марка
 INNER JOIN вылеты
 ON марка.КодМ = вылеты.марка)
 ON пилоты.КодП = вылеты.пилот)
 ON типы.КодТ = вылеты.тип
GROUP BY пилоты.пилот;


пилотMin-дата вылетаMax-дата вылета
Антон04.10.201804.12.2018
Вася02.10.201802.12.2018
Коля01.10.201801.12.2018
Петя05.10.201805.12.2018


зап3
SELECT вылеты.КодВ, пилоты.пилот, марка.марка, типы.тип,
 вылеты.[дата вылета], вылеты.[дата прилета]
FROM зап2, типы
 INNER JOIN (пилоты
 INNER JOIN (марка
 INNER JOIN вылеты
 ON марка.КодМ = вылеты.марка)
 ON пилоты.КодП = вылеты.пилот)
 ON типы.КодТ = вылеты.тип
WHERE (((вылеты.[дата вылета])=[зап2].[Min-дата вылета]
 Or (вылеты.[дата вылета])=[зап2].[Max-дата вылета]))
ORDER BY пилоты.пилот, вылеты.[дата вылета];


КодВпилотмарка.маркатипдата вылетадата прилета
12АнтонА-320турбореактивный04.10.201806.12.2018
4АнтонА-320турбореактивный04.12.201806.12.2018
10ВасяА-320турбореактивный02.10.201803.12.2018
2ВасяА-320турбореактивный02.12.201803.12.2018
9КоляАН-24турбовинтовой01.10.201802.12.2018
1КоляАН-24турбовинтовой01.12.201802.12.2018
11ПетяXian МА-700турбовинтовой05.10.201806.12.2018
3ПетяXian МА-700турбовинтовой05.12.201806.12.2018
24 дек 18, 14:57    [21772170]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4408
Serg197311
anton6
И так и так скобки ставил... не получается... прошу помочь

Вот заморочился то.... Я через конструктор делаю, он сам все скобки как надо расставляет...

я тоже запрос делаю через конструктор, а уже потом разбиваю на подстроки для переноса в код

причем, всегда без строк продолжение. но с пробелом перед очередной подстрокой

s1=" select ............"
s1=s1 & " from ..........."
s1=s1 & " inner..............."
s1=s1 & " where ..............
24 дек 18, 15:01    [21772178]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5597
ПЕНСИОНЕРКА
anton6,
выложите пример базы
Вас же просят. Ванговать же не все умеют
24 дек 18, 15:33    [21772218]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
Serg197311
Member

Откуда:
Сообщений: 362
ПЕНСИОНЕРКА
всегда без строк продолжение. но с пробелом перед очередной подстрокой


И я, именно так.
24 дек 18, 15:51    [21772237]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
__Michelle
Member

Откуда:
Сообщений: 3011
anton6
Все...все перегуглил... нашел синтаксис для vba
через одну таблицу запрос сделал, через две никак...
Подскажите, пожалуйста, где неточности


Это работает
sb = "SELECT [Pilots$].PilotID, [Samoletlist$].samoletId, [Samolets$].SamoletsId, [Samolets$].SamoletmarkaId " _
& "FROM ([Pilots$]" _
& "inner JOIN [Samoletlist$] ON [Pilots$].PilotID = [Samoletlist$].PilotID)" _
& "inner JOIN [Samolets$] ON [Samoletlist$].samoletId = [Samolets$].SamoletsId" _
& "Where Name like 'Вася'"

А это уже нет...
sb = "SELECT [Pilots$].PilotID, [Samoletlist$].samoletId, [Samolets$].SamoletsId, [Samolets$].SamoletmarkaId, [SamoletMarka$].SamoletMarkaName  " _
& "FROM ([Pilots$]" _
& "inner JOIN [Samoletlist$] ON [Pilots$].PilotID = [Samoletlist$].PilotID)" _
& "inner JOIN [Samolets$] ON [Samoletlist$].samoletId = [Samolets$].SamoletsId" _
'& "inner JOIN [SamoletMarka$] ON [Samolets$].SamoletmarkaId= [SamoletMarka$].SamoletmarkaId " _
& "Where Name like 'Вася'"


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

Скорее поверю, что работает второй запрос, а первый нет.
В первом нет пробела перед WHERE.
sb = "SELECT [Pilots$].PilotID, [Samoletlist$].samoletId, [Samolets$].SamoletsId, [Samolets$].SamoletmarkaId " & _
     "FROM ([Pilots$]" & _
     "inner JOIN [Samoletlist$] ON [Pilots$].PilotID = [Samoletlist$].PilotID)" & _
     "inner JOIN [Samolets$] ON [Samoletlist$].samoletId = [Samolets$].SamoletsId " & _
     "Where Name like 'Вася'"
В конце второй и третьей строки пробелы тоже бы не помешали, хотя их отсутствие и компенсируется другими разделителями - ] и ).
И еще.
Name like 'Вася' смысла не имеет, тогда уж Name = 'Вася'.
24 дек 18, 16:01    [21772249]     Ответить | Цитировать Сообщить модератору
 Re: Запрос через несколько таблиц  [new]
anton6
Member

Откуда:
Сообщений: 80
Все.... написал...час назад...
Дело было в пробеле...


Всем спасибо, но эта задачи заставила меня сдаться))
24 дек 18, 20:22    [21772452]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft Access Ответить