Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
9 / 9 / 2
Регистрация: 05.07.2013
Сообщений: 86
1

Сложный запрос

10.07.2013, 12:53. Показов 1184. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите сделать запрос, в котором участвует несколько таблиц.
Я объединяю с помощью INNER JOIN 4 таблицы, плюс одну таблицу LEFT JOIN...
Соль в том, что внутри LEFT JOIN должен быть INNER JOIN.
Короче мне нужно:
1. объединить 4 таблицы
2. объединить другие 2 таблицы
3. объединить п.1 и п.2
Взорвал себе голову
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2013, 12:53
Ответы с готовыми решениями:

сложный запрос (для меня сложный)
Есть таблица с продажами услуг от разных фирм, есть таблица с оплатой за предоставленные услуги...

Сложный запрос
Я в ступоре. Есть два запроса, которые построены не на взаимосвязанных таблицах. Но данные из этих...

Сложный запрос
Добрый день! Столкнулся с тем что нужно сделать SQL запрос к базе Accsess 2013 И прошу помощи,...

Сложный запрос
Бодрое утро, подскажите нужно сделать запрос результат которого нужно добавить до текущей таблицы....

15
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
10.07.2013, 12:59 2
Вы сами правильно сделали последовательность действий. Но в пункте 2, вместо непосредственного соединения обоих таблиц, надо сделать подзапрос, объединяющий "другие 2 таблицы" и его уже джойнить с остальными.
1
8862 / 5910 / 585
Регистрация: 27.03.2013
Сообщений: 19,584
10.07.2013, 13:00 3
Да, я бы тоже с удовольствием посмотрел как это сделается, но не виртуально, а на примере
0
9 / 9 / 2
Регистрация: 05.07.2013
Сообщений: 86
10.07.2013, 13:14  [ТС] 4
Цитата Сообщение от mobile Посмотреть сообщение
Вы сами правильно сделали последовательность действий. Но в пункте 2, вместо непосредственного соединения обоих таблиц, надо сделать подзапрос, объединяющий "другие 2 таблицы" и его уже джойнить с остальными.
давайте на пальцах лучше

//соединяю (простите, не 4, а 3 таблицы)
SELECT ...
FROM (((... INNER JOIN ... ON ...) INNER JOIN ... ON ...) INNER JOIN ... ON ...)
//к полученной таблице добавляю те самые "другие 2 таблицы"
LEFT OUTER JOIN ... ON ... // где то здесь должны были они соединиться
0
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
10.07.2013, 13:27 5
IsRiot, если бы вы показали свой запрос, легче было бы сориентироваться. Согласитесь, я понятия не имею, что и как вы джойните. Есть общие принципы, я их высказал. А конкретность может быть только обоюдной.

В дополнение могу привести строку из хелпа:
Операции LEFT JOIN или RIGHT JOIN могут быть вложены в операцию INNER JOIN, но операция INNER JOIN не может быть вложена в операцию LEFT JOIN или RIGHT JOIN.
Именно поэтому я и предложил вместо непосредственного соединения таблиц, сделать подзапрос, объединяющий таблицы из пункта 2.
1
9 / 9 / 2
Регистрация: 05.07.2013
Сообщений: 86
10.07.2013, 13:56  [ТС] 6
mobile
попытаюсь попроще и покороче
некоторые опущу
таблицы:
Люди {ИД_человека, Код_фамилии, ...}
справочник_фамилий {код, фамилия}
изменения_фамилий {ИД_человека_сменившего_фамилию, код_предыдущей_фамилии}

сам запрос:
SELECT
люди.ид_человека,
справочник_фамилий.фамилия,
изменения_фамилий.ид_человека_сменившего_фамилию,
изменения_фамилий.код_предыдущей_фамилии

FROM (люди INNER JOIN справочник_фамилий ON люди.код_фамилии = справочник_фамилий.код) LEFT JOIN изменения_фамилий ON люди.ид_человека = изменения_фамилий.ИД_человека_сменившего_фамилию

все коды фамилий заменяются на соотв. фамилии из справочника. Вот только осталось заменить код_предыдущей_фамилии на фамилию из справочника, где то в LEFT JOIN
0
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
10.07.2013, 14:34 7
Попробуйте, хотя сомнения есть
SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT
  q1.ид_человека,
  q1.фамилия,
  q2.ид_человека_сменившего_фамилию,
  q2.код_предыдущей_фамилии
FROM 
  (SELECT люди.ид_человека, справочник_фамилий.фамилия
     FROM люди INNER JOIN справочник_фамилий ON люди.код_фамилии = справочник_фамилий.код) q1,
  (SELECT люди.ид_человека, изменения_фамилий.ид_человека_сменившего_фамилию, изменения_фамилий.код_предыдущей_фамилии
     FROM люди INNER JOIN изменения_фамилий ON люди.ид_человека = изменения_фамилий.ИД_человека_сменившего_фамилию) q2,
  q1 LEFT JOIN q2 ON q1.ид_человека=q2.ид_человека
Добавлено через 6 минут
Немного ошибся. Исправил

Добавлено через 2 минуты
Стоп. Я кажется недопонял ситуацию. Нужна же предыдущая фамилия, в не ее код

Добавлено через 15 минут
Так попробуйте
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
  q1.ид_человека,
  q1.фамилия,
  q2.ид_человека_сменившего_фамилию,
  q2.код_предыдущей_фамилии
  q2.Фамилия AS ПредыдущаяФамилия
FROM 
  (SELECT люди.ид_человека, справочник_фамилий.фамилия
     FROM люди INNER JOIN справочник_фамилий ON люди.код_фамилии = справочник_фамилий.код) q1,
  (SELECT p.ид_человека, s.Фамилия, i.ид_человека_сменившего_фамилию, i.код_предыдущей_фамилии
     FROM люди p, справочник_фамилий s, изменения_фамилий i,
     i INNER JOIN s ON i.код_предыдущей_фамилии = s.код,
     p.ид_человека = i.ИД_человека_сменившего_фамилию) q2,
  q1 LEFT JOIN q2 ON q1.ид_человека=q2.ид_человека
2
9 / 9 / 2
Регистрация: 05.07.2013
Сообщений: 86
10.07.2013, 17:47  [ТС] 8
в первом случае ругается на синтаксис в JOIN, сейчас попробую второй

если сделать так, то вывод норм, но будет код предущей фамилии

SQL
1
2
3
4
5
SELECT        
люди.ид_человека, справочник_фамилий.фамилия, изменения_фамилий.код_предыдущей_фамилии
FROM            
((люди INNER JOIN справочник_фамилий ON люди.код_фамилии = справочник_фамилий.код) 
LEFT OUTER JOIN изменения_фамилий ON людиl.ид_человека = изменения_фамилий.код_предыдущей фамилии)
я попробовал так:

SQL
1
2
3
4
5
6
7
SELECT        
люди.ид_человека, справочник_фамилий.фамилия, изменения_фамилий.код_предыдущей_фамилии
FROM            
((люди INNER JOIN справочник_фамилий ON люди.код_фамилии = справочник_фамилий.код) 
LEFT OUTER JOIN 
(SELECT справочник_фамилий.фамилия FROM изменения_фамилий INNER JOIN справочник_фамилий ON изменения_фамилий.код_предыдущей_фамилии =  справочник_фамилий.код) 
изменения_фамилий ON люди.ид_человека = изменения_фамилий.код_предыдущей фамилии)
но тоже ругается на синтаксис

Добавлено через 2 часа 55 минут
сейчас рабочий день окончен, попробую завтра на свежую голову сделать подзапрос в LEFT JOIN
больше чем уверен, что косяки все в синтаксисе(((
0
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
10.07.2013, 17:56 9
А вы пробовали второй вариант?
Если и он неверен, то желательно выставить фрагмент БД здесь.
2
8862 / 5910 / 585
Регистрация: 27.03.2013
Сообщений: 19,584
10.07.2013, 21:17 10
Проздравляю с - 4000, Подлиза - пух
0
mobile
10.07.2013, 21:26
  #11

Не по теме:

Кликните здесь для просмотра всего текста
kmv-puh, спасибо. Стараюсь :-)

0
VinniPuh
10.07.2013, 21:30
  #12

Не по теме:

Думаю сегодня можно уже отдохнуть и отметить данное событие :drink: :)

0
9 / 9 / 2
Регистрация: 05.07.2013
Сообщений: 86
11.07.2013, 08:14  [ТС] 13
тоже ругается, на FROM
Цитата Сообщение от mobile Посмотреть сообщение
(SELECT p.ид_человека, s.Фамилия, i.ид_человека_сменившего_фамилию, i.код_предыдущей_фамилии
* * *FROM люди p, справочник_фамилий s, изменения_фамилий i,
* * *i INNER JOIN s ON i.код_предыдущей_фамилии = s.код,
* * *p.ид_человека = i.ИД_человека_сменившего_фамилию) q2,
* q1 LEFT JOIN q2 ON q1.ид_человека=q2.ид_человека
скорее всего на этот
0
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
11.07.2013, 08:40 14
В главном селекте была пропущена запятая. Других ошибок пока не вижу. Имена таблиц/полей использованы ваши.

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
  q1.ид_человека,
  q1.фамилия,
  q2.ид_человека_сменившего_фамилию,
  q2.код_предыдущей_фамилии, 
  q2.Фамилия AS ПредыдущаяФамилия
FROM 
  (SELECT люди.ид_человека, справочник_фамилий.фамилия
     FROM люди INNER JOIN справочник_фамилий ON люди.код_фамилии = справочник_фамилий.код) q1,
  (SELECT p.ид_человека, s.Фамилия, i.ид_человека_сменившего_фамилию, i.код_предыдущей_фамилии
     FROM люди p, справочник_фамилий s, изменения_фамилий i,
     i INNER JOIN s ON i.код_предыдущей_фамилии = s.код,
     p.ид_человека = i.ИД_человека_сменившего_фамилию) q2,
  q1 LEFT JOIN q2 ON q1.ид_человека=q2.ид_человека
Желателен хотя бы небольшой пример БД с нужными таблицами
1
9 / 9 / 2
Регистрация: 05.07.2013
Сообщений: 86
11.07.2013, 08:50  [ТС] 15
осознавая ваш пример кода, я понял что нужно разбить запрос на несколько.
Ведь по частям они у меня работали отлично. Решил проблему именно так:
1. Объединил первые три таблицы - Основной_запрос
2. Изменения фамилий объединил со справочником фамилий - Изменение_фамилий
3. В основной_запрос обращаюсь к запросу изменение_фамилий
Спасибо за помощь!


А теперь хоте спросить о базе данных,
та база в которой я работаю показалась мне странной...
Есть таблица с именами, с фамилиями, отчествами, таблица с людьми в которой указаны коды имени фамилии и отчества... Так реально делают? Можно же сделать одну таблицу людей и хранить в ней и имя и фамилию и отчество. Зачем три лишние таблицы и теперешний геморрой с запросами?
1
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
11.07.2013, 08:58 16
Цитата Сообщение от IsRiot Посмотреть сообщение
та база в которой я работаю показалась мне странной...
Есть таблица с именами, с фамилиями, отчествами, таблица с людьми в которой указаны коды имени фамилии и отчества... Так реально делают? Можно же сделать одну таблицу людей и хранить в ней и имя и фамилию и отчество. Зачем три лишние таблицы и теперешний геморрой с запросами?
IsRiot, если люди меняют фамилию и надо хранить историю смены, то ведь это надо как-то учесть. Вот, как вариант справочник изменения_фамилий. Но сам справочник_фамилий, пожалуй излишество. Достаточно было справочника людей, связанного с таблицей изменения фамилий.
1
11.07.2013, 08:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2013, 08:58
Помогаю со студенческими работами здесь

сложный запрос(!)
всем привет! подскажите пожалуйста как реализовать такой запрос: 1. таблица "профессия":...

Сложный запрос
Нужно создать запрос, который подсчитает общий доход за указанный интервал времени. Начальная и...

Сложный запрос
Помогите пожалуйста создать сложный запрос, нужно получить выборку со столбцами...

сложный запрос
Народ создал БД на тему экзаменирования студентов. задание создать БД в табличном представлении,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru