Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/58: Рейтинг темы: голосов - 58, средняя оценка - 4.79
0 / 0 / 1
Регистрация: 18.03.2013
Сообщений: 55
1

Оператор INNER JOIN

21.03.2013, 18:09. Показов 11652. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. У меня такой вопрос: с подзапросами типа select я разобрался. Создал БД на аксесе. Для создания необходимых мне запросов использую мастер. После этого посмотрел код и он мне мягко говоря не понятен. Объясните, какие скобки что возвращают:
SQL
1
2
3
SELECT ВидВооружения.Наименование, Страна.Наименование AS Страна_Наименование, Вооружение.Наименование AS Вооружение_Наименование, ТипВооружения.Наименование AS ТипВооружения_Наименование
FROM ТипВооружения INNER JOIN (Страна INNER JOIN (ВидВооружения INNER JOIN Вооружение ON ВидВооружения.[Код] = Вооружение.[КодВида]) ON Страна.[Код] = Вооружение.[КодСтраны]) ON ТипВооружения.[Код] = Вооружение.[КодТипа]
WHERE (((ВидВооружения.Наименование)="Стрелково-пушечное" OR (ВидВооружения.Наименование)="Управляемые ракеты воздух-воздух") AND ((Страна.Наименование)="Великобритания" OR (Страна.Наименование)="Россия" OR (Страна.Наименование)="США"));
.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2013, 18:09
Ответы с готовыми решениями:

SQL и оператор JOIN
Помогите составить SQL запрос соединение 3 таблиц связанных по полю IBQuery1.Active:=False;...

Оператор Join (мускул)
По отдельности запросы работают, при обьединении по Юнион выводит совсем далекое. Лефт джоин что-то...

Оператор Join что ты за фрукт?
Здравствуйте. Как только я подумал, что я понял как работает оператор Join он меня приятно удивил....

Ошибка: no matching function for call to 'QStringList::join()' file.write(lines.join();
почему возникает эта ошибка? у меня в qt creator-е автодополнение показывает что есть такой метод...

12
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
22.03.2013, 01:27 2
Цитата Сообщение от 26ded26 Посмотреть сообщение
посмотрел код и он мне мягко говоря не понятен. Объясните, какие скобки что возвращают:
SQL
1
2
3
SELECT ВидВооружения.Наименование, Страна.Наименование AS Страна_Наименование, Вооружение.Наименование AS Вооружение_Наименование, ТипВооружения.Наименование AS ТипВооружения_Наименование
FROM ТипВооружения INNER JOIN (Страна INNER JOIN (ВидВооружения INNER JOIN Вооружение ON ВидВооружения.[Код] = Вооружение.[КодВида]) ON Страна.[Код] = Вооружение.[КодСтраны]) ON ТипВооружения.[Код] = Вооружение.[КодТипа]
WHERE (((ВидВооружения.Наименование)="Стрелково-пушечное" OR (ВидВооружения.Наименование)="Управляемые ракеты воздух-воздух") AND ((Страна.Наименование)="Великобритания" OR (Страна.Наименование)="Россия" OR (Страна.Наименование)="США"));
.
Чтобы не ломать голову в хитросплениях скобок, рекомендую освоить иной метод записи связей в запросе. Впервые его предложил Karfaqen. Может настоящий автор иной, но мне он не известен. Смысл метода в том, что сначала записывают источники (таблицы, запросы) через запятые, а потом, также через запятые все джойны. И читабельность запроса станет значительно лучше.
Кроме того, в длинных запросах имеет смысл применять алиасы (псевдонимы) таблиц для сокращения записи и ее лучшей читаемости.
Также списки условий, перечисляемые через OR, можно упаковать в список IN.
С учетом всего этого текст вашего запроса

SQL
1
2
3
4
5
6
7
8
SELECT st.Наименование AS Страна_Наименование, vr.Наименование AS Вооружение_Наименование, 
   tv.Наименование AS ТипВооружения_Наименование
FROM ТипВооружения tv, Страна st, ВидВооружения vv, Вооружение vr,
   tv INNER JOIN vr ON tv.[Код] = vr.[КодТипа],
   st INNER JOIN vr ON st.[Код] = vr.[КодСтраны],
   vv INNER JOIN vr ON vv.[Код] = vr.[КодВида]
WHERE vv.Наименование IN ("Стрелково-пушечное", "Управляемые ракеты воздух-воздух") 
   AND st.Наименование IN ("Великобритания", "Россия", "США)"
К великому сожалению конструктор запросов не сохраняет форматирование и переписывает их по своему. Но при отладке запроса понятная и ясная запись очень нужна
1
0 / 0 / 1
Регистрация: 18.03.2013
Сообщений: 55
22.03.2013, 11:43  [ТС] 3
К сожалению Ваш запрос не работоспособен. К тому же мне не понятно каким образом мы ушли от этих скобок.
0
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
22.03.2013, 11:55 4
Цитата Сообщение от 26ded26 Посмотреть сообщение
К сожалению Ваш запрос не работоспособен. К тому же мне не понятно каким образом мы ушли от этих скобок.
Ошибка в последней строке. Исправленный вариант:
SQL
1
AND st.Наименование IN ("Великобритания", "Россия", "США")
Ушли от скобок за счет иного, но тоже допустимого синтаксиса запроса
1
0 / 0 / 1
Регистрация: 18.03.2013
Сообщений: 55
22.03.2013, 12:52  [ТС] 5
Эту ошибку я сразу изменил но почему то просит ввести параметр запроса, а именно наименование вооружения.

Добавлено через 1 минуту
и тип вооружения. Вообщем то-что не определено в запросе.

Добавлено через 38 минут
Вообщем заработало только в таком виде
SQL
1
2
3
4
SELECT ВидВооружения.Наименование, Страна.Наименование AS Страна_Наименование, Вооружение.Наименование AS Вооружение_Наименование, ТипВооружения.Наименование AS ТипВооружения_Наименование
FROM ТипВооружения INNER JOIN (Страна INNER JOIN (ВидВооружения INNER JOIN Вооружение ON ВидВооружения.[Код] = Вооружение.[КодВида]) ON Страна.[Код] = Вооружение.[КодСтраны]) ON ТипВооружения.[Код] = Вооружение.[КодТипа]
 
WHERE ВидВооружения.Наименование IN ("Авиабомбы", "Управляемые ракеты воздух-воздух") AND Страна.Наименование IN ("Великобритания", "Россия", "США");
Добавлено через 13 минут
SQL
1
SELECT ВидВооружения.Наименование AS Вид, Вооружение.Наименование AS Название FROM ВидВооружения vVor INNER JOIN Вооружение vor ON vVor.[Код]=vor.[КодВида];
почему запрос такого типа просит ввести ВидВооружения.Наименование??????
0
3356 / 1775 / 83
Регистрация: 05.08.2010
Сообщений: 4,471
22.03.2013, 13:11 6
Цитата Сообщение от 26ded26 Посмотреть сообщение
почему запрос такого типа просит ввести ВидВооружения.Наименование??????
Выложить пример можете?
0
0 / 0 / 1
Регистрация: 18.03.2013
Сообщений: 55
22.03.2013, 13:14  [ТС] 7
ну как же где?
SQL
1
FROM [COLOR="Black"]ВидВооружения[/COLOR] vVor INNER JOIN Вооружение vor ON vVor.[Код]=vor.[КодВида];
Добавлено через 57 секунд
SQL
1
FROM ВидВооружения vVor INNER JOIN Вооружение vor ON vVor.[Код]=vor.[КодВида];
0
3356 / 1775 / 83
Регистрация: 05.08.2010
Сообщений: 4,471
22.03.2013, 13:15 8
Цитата Сообщение от 26ded26 Посмотреть сообщение
ну как же где?
Не обратил внимания сразу.
Пример приложить можете?
0
0 / 0 / 1
Регистрация: 18.03.2013
Сообщений: 55
22.03.2013, 13:18  [ТС] 9
А так
SQL
1
SELECT * FROM Вооружение INNER JOIN ВидВооружения ON Вооружение.[КодВида] = ВидВооружения.[Код];
работает.

Добавлено через 27 секунд
Пример чего?

Добавлено через 1 минуту
Цитата Сообщение от Agapov_stas Посмотреть сообщение
Пример приложить можете?
Пример чего?
0
3356 / 1775 / 83
Регистрация: 05.08.2010
Сообщений: 4,471
22.03.2013, 13:18 10
Цитата Сообщение от 26ded26 Посмотреть сообщение
Пример чего?
Данных , ё-маё...
Хотя не в них дело..
0
0 / 0 / 1
Регистрация: 18.03.2013
Сообщений: 55
22.03.2013, 13:21  [ТС] 11
Цитата Сообщение от Agapov_stas Посмотреть сообщение
Данных , ё-маё...
ВидВооружения.Наименование: "стрелково-пушечное" "авиабомбы", "управляемые ракеты воздух-воздух".
Вооружение.Наименование: "M134 Minigun", "СНАРС-250", "GAR-4 Falcon", "Highball".
0
3356 / 1775 / 83
Регистрация: 05.08.2010
Сообщений: 4,471
22.03.2013, 13:24 12
Аааа...Так дело в том, что в селекте иные таблицы...Вы даете таблицам алиасы, а в селекте используете истинные названия...

Надо ж так тогда в Select-е писАть..

SQL
1
2
SELECT vVor.Наименование AS Вид, vor.Наименование AS Название 
FROM ВидВооружения vVor INNER JOIN Вооружение vor ON vVor.[Код]=vor.[КодВида];
2
0 / 0 / 1
Регистрация: 18.03.2013
Сообщений: 55
22.03.2013, 13:31  [ТС] 13
Цитата Сообщение от Agapov_stas Посмотреть сообщение
Хотя не в них дело..
ну а в чем тогда??

Добавлено через 2 минуты
Цитата Сообщение от Agapov_stas Посмотреть сообщение
Аааа...Так дело в том, что в селекте иные таблицы...Вы даете таблицам алиасы, а в селекте используете истинные названия...
Надо ж так тогда в Select-е писАть..
ЭВРИКА!!!!!!!!!!! Заработало! И багаж знаний пополнился)))) Спасибо.
0
22.03.2013, 13:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.03.2013, 13:31
Помогаю со студенческими работами здесь

Не выполняется код PHP. Warning: join() [function.join]: Invalid arguments passed
Помогите разобраться в коде <?php $text = file_get_contents('input.txt'); ...

Как записать Left Join (Right Join) при помощи Linq, используя fluent-синтаксис
Как записать Left Join (Right Join) при помощи Linq используя fluent - синтаксис? У меня есть...

JOIN (или не JOIN?) - показать все записи только левой таблицы, дополнив значениями правой
Хочу вывести все записи одной таблицы, дополнив данными из других таблиц. При этом записи других...

Разница между выражениями с join и без join
Вот это: SELECT o.OrderID, o.OrderDate, c.CustomerName FROM Customers AS c, Orders AS o WHERE...


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

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