9 / 9 / 2
Регистрация: 05.07.2013
Сообщений: 86
|
|
1 | |
Сложный запрос10.07.2013, 12:53. Показов 1184. Ответов 15
Метки нет (Все метки)
Помогите сделать запрос, в котором участвует несколько таблиц.
Я объединяю с помощью INNER JOIN 4 таблицы, плюс одну таблицу LEFT JOIN... Соль в том, что внутри LEFT JOIN должен быть INNER JOIN. Короче мне нужно: 1. объединить 4 таблицы 2. объединить другие 2 таблицы 3. объединить п.1 и п.2 Взорвал себе голову
0
|
10.07.2013, 12:53 | |
Ответы с готовыми решениями:
15
сложный запрос (для меня сложный) Сложный запрос Сложный запрос Сложный запрос |
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 |
давайте на пальцах лучше
//соединяю (простите, не 4, а 3 таблицы) SELECT ... FROM (((... INNER JOIN ... ON ...) INNER JOIN ... ON ...) INNER JOIN ... ON ...) //к полученной таблице добавляю те самые "другие 2 таблицы" LEFT OUTER JOIN ... ON ... // где то здесь должны были они соединиться
0
|
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
|
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|||||||||||
10.07.2013, 14:34 | 7 | ||||||||||
Попробуйте, хотя сомнения есть
Немного ошибся. Исправил Добавлено через 2 минуты Стоп. Я кажется недопонял ситуацию. Нужна же предыдущая фамилия, в не ее код Добавлено через 15 минут Так попробуйте
2
|
9 / 9 / 2
Регистрация: 05.07.2013
Сообщений: 86
|
|||||||||||
10.07.2013, 17:47 [ТС] | 8 | ||||||||||
в первом случае ругается на синтаксис в JOIN, сейчас попробую второй
если сделать так, то вывод норм, но будет код предущей фамилии
Добавлено через 2 часа 55 минут сейчас рабочий день окончен, попробую завтра на свежую голову сделать подзапрос в LEFT JOIN больше чем уверен, что косяки все в синтаксисе(((
0
|
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 |
0
|
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
||||||
11.07.2013, 08:40 | 14 | |||||
В главном селекте была пропущена запятая. Других ошибок пока не вижу. Имена таблиц/полей использованы ваши.
1
|
9 / 9 / 2
Регистрация: 05.07.2013
Сообщений: 86
|
|
11.07.2013, 08:50 [ТС] | 15 |
осознавая ваш пример кода, я понял что нужно разбить запрос на несколько.
Ведь по частям они у меня работали отлично. Решил проблему именно так: 1. Объединил первые три таблицы - Основной_запрос 2. Изменения фамилий объединил со справочником фамилий - Изменение_фамилий 3. В основной_запрос обращаюсь к запросу изменение_фамилий Спасибо за помощь! А теперь хоте спросить о базе данных, та база в которой я работаю показалась мне странной... Есть таблица с именами, с фамилиями, отчествами, таблица с людьми в которой указаны коды имени фамилии и отчества... Так реально делают? Можно же сделать одну таблицу людей и хранить в ней и имя и фамилию и отчество. Зачем три лишние таблицы и теперешний геморрой с запросами?
1
|
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|
11.07.2013, 08:58 | 16 |
IsRiot, если люди меняют фамилию и надо хранить историю смены, то ведь это надо как-то учесть. Вот, как вариант справочник изменения_фамилий. Но сам справочник_фамилий, пожалуй излишество. Достаточно было справочника людей, связанного с таблицей изменения фамилий.
1
|
11.07.2013, 08:58 | |
11.07.2013, 08:58 | |
Помогаю со студенческими работами здесь
16
сложный запрос(!) Сложный запрос Сложный запрос сложный запрос Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |