Выборка из двух таблиц SQL
Добрый вечер, народ помогите пожалуйста. Есть таблица Client со столбцами id_client , phone_client , name_client , taxipark_id_taxipark . Есть таблица Taxipark со столбцами id_taxipark , name_taxipark , phone_taxipark . Есть Client «Максим». Нужно вывести таксопарк, обслуживающий «Максима». Запрос:
select name_taxipark from taxipark where id_taxipark in (select taxipark_id_taxipark from client where name_client.client = 'Maxim');
ERROR 1054 (42S22): Unknown column ‘name_client.client’ in ‘where clause’
Помогите пожалуйста решить проблему.
Отслеживать
7,175 9 9 золотых знаков 37 37 серебряных знаков 66 66 бронзовых знаков
задан 11 дек 2017 в 18:34
15 1 1 золотой знак 1 1 серебряный знак 3 3 бронзовых знака
замените name_client.client на client.name_client . Сначала указывается имя таблицы, а потом ее поле
11 дек 2017 в 18:37
Спасибо огромное!
11 дек 2017 в 18:53
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
select taxipark.name_taxipark from client, taxipark where client.name_client = 'Maxim' AND client.taxipark_id_taxipark = taxipark.id_taxipark
вроде не запутался с вашими названиями.
А вообще, есть предложение сделать названия столбцов покороче. Никаких проблем (путаницы) в дальнейшем не будет. Но будет более читабельно. и всем привычнее.
taxiparks [id, name, phone] clients [id, name, phone, taxipark_id]
И запрос тогда будет выглядеть так
SELECT taxiparks.name FROM taxiparks, clients WHERE taxiparks.id = clients.taxipark_id AND clients.name = 'Maxim'
Лучше писать с inner join или, если нужно, с left join.
SELECT taxiparks.name FROM clients LEFT JOIN taxiparks ON clients.taxipark_id = taxiparks.id WHERE clients.name = 'Maxim'
Как вывести данные из двух таблиц?
Но код выводит данные только из `people_city2` ровно столько раз, сколько записей в `people_city1`.
P. S. Сделать вывод нужно только с помощью объединения этих таблиц, но не делать просто из 2 таблиц одну. Как мне быть, в чём моя ошибка?
- Вопрос задан 27 июн.
- 197 просмотров
1 комментарий
Простой 1 комментарий

ThunderCat @ThunderCat Куратор тега PHP
а чем принципиально отличаются people_city1 и people_city2, что их понадобилось выносить в отдельные таблицы?
Решения вопроса 2

Ипатьев @ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Ошибка детская, она вот в этом: «Есть 2 таблицы, в которых одинаковые поля».
Очень часто новички, которые не понимают, как работает база данных, делают подобное.
И всегда потом приходится переделывать, даже если очень не хочется.
Потому что в БД не должно быть таблиц с одинаковыми полями. Собственно, сообразительные новички уже на этом вопросе, «как выбрать из двух таблиц» начинают понимать, что у них что-то пошло не так.
Так что надо просто сделать одну таблицу, записать в неё данные из всех таблиц с одинаковыми полями, и выбирать из неё обычным способом.
Имя таблицы, кстати, тоже очень странное. Наверняка там внутри тоже треш и угар и вот её-то как раз и надо разделить, только не горизонтально, а вертикально. Судя по составу полей, нужна одна таблица city и одна таблица people, в которой указывается только city id
Ответ написан 27 июн.
Нравится 5 2 комментария
Andrew Kolomiets @Coolam Автор вопроса
В одной таблице люди из одного города
В другой таблице люди из другого города
Т.е. абсолютно никак не получится вывести 2 таблицы сразу, а нужно просто сделать из этих 2-ух таблиц одну?

Ипатьев @ipatiev Куратор тега PHP
Я там написал ниже — как.
в одной таблице города
в другой — все люди у каждого из которых указан id города
и вот как раз джойн, который вы так топорно пытались использовать, как раз и нужен чтобы соединять таблицу людей с таблицей городов.
Выборка данных из нескольких таблиц (JOIN)
Довольно часто приходится выбирать данные из нескольких таблиц. Для показа в одном запросе данных из нескольких таблиц Oracle позволяет выполнять так называемые соединения таблиц. Имеется два относящихся к соединению таблиц правила, о которых следует постоянно помнить. Данные из двух (или нескольких) таблиц могут быть объединены в том случае, если у обеих таблиц имеется совпадающий столбец (с тем же самым или с другим именем) и этот столбец в одной из таблиц является первичным ключом (или частью этого ключа).
Давайте рассмотрим пример оператора соединения (join), использующего традиционный синтаксис Oracle, где мы объединяем вместе содержимое таблиц emp и dept для получения перечня всех сотрудников и названий отделов, где они работают:
SELECT e.ename, e.deptno, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno;
| ENAME | DEPTNO | DNAME |
|---|---|---|
| CLARK | 10 | ACCOUNTING |
| KING | 10 | ACCOUNTING |
| MILLER | 10 | ACCOUNTING |
| JONES | 20 | RESEARCH |
| FORD | 20 | RESEARCH |
| ADAMS | 20 | RESEARCH |
| SMITH | 20 | RESEARCH |
| SCOTT | 20 | RESEARCH |
| WARD | 30 | SALES |
| TURNER | 30 | SALES |
| ALLEN | 30 | SALES |
| JAMES | 30 | SALES |
| BLAKE | 30 | SALES |
| MARTIN | 30 | SALES |
Обратите внимание на многие важные компоненты этого соединения таблиц. Использование во фразе FROM двух таблиц четко указывает на то, что имеет место соединиения таблиц. Обратите также внимание на то, что перед именем каждой таблицы присутствует буква: e для таблицы emp или d для таблицы dept. Это служит иллюстрацией интересной концепции – столбцы могут иметь псевдонимы точно так же, как их имеют таблицы. Псевдонимы служат важной цели – они не дают Oracle запутаться в том, какую таблицу использовать при выводе данных в столбец deptno. Вспомните, что в обеих таблицах (emp и dept) имеются столбцы с именем deptno.
Неоднозначности при соединении таблиц можно также избежать, если в качестве префикса перед именем столбца указать имена таблиц.
SELECT emp.ename, emp.deptno, dept.dname FROM emp, dept WHERE emp.deptno = dept.deptno;
Заметьте, что в нашу фразу WHERE включено сравнение по полю deptno, соединяющему данные в emp с данными в dept. В случае отсутствия этой связи в выходные данные были вы включены все данные из emp и dept.
Синтаксис соединения по ANSI/ISO
В соответствии с синтаксисом ANSI/ISO, для того, чтобы соединить содержимое двух таблиц для получения единого результата, мы должны включить в SQL-оператор фразу JOIN имятаблицы ON условиесоединения. Если вы хотите в соответствии с этим синтаксисом выполнить то же соединение таблиц, которое мы делали раньше, наш оператор будет выглядеть следующим образом:
SELECT ename, emp.deptno, dname FROM emp JOIN dept ON emp.deptno = dept.deptno;
| ENAME | DEPTNO | DNAME |
|---|---|---|
| CLARK | 10 | ACCOUNTING |
| KING | 10 | ACCOUNTING |
| MILLER | 10 | ACCOUNTING |
| JONES | 20 | RESEARCH |
| FORD | 20 | RESEARCH |
| ADAMS | 20 | RESEARCH |
| SMITH | 20 | RESEARCH |
| SCOTT | 20 | RESEARCH |
| WARD | 30 | SALES |
| TURNER | 30 | SALES |
| ALLEN | 30 | SALES |
| JAMES | 30 | SALES |
| BLAKE | 30 | SALES |
| MARTIN | 30 | SALES |
Обратите внимание на различия между этим синтаксисом и синтаксисом Oracle. Во-первых, в синтаксисе ANSI/ISO сравнения, используемые для соединения, отделяются от всех остальных сравнений с помощью специального ключевого слова ON, указывающего на то, что именно это сравнение используется для соединения. Вы по-прежнему можете включать в соответствующие ANSI/ISO запросы на соединение фразу WHERE. Единственное отличие состоит в том, что фраза WHERE теперь будет содержать только дополнительные операторы сравнения, используемые дл дополнительной фильтрации данных. Кроме того, вы не должны теперь указывать во фразе FROM имена всех объединяемых таблиц. Вместо этого сразу же после фразы FROM вы должны использовать фразу JOIN, в которой и будут определены имена всех соединяемых таблиц.
Естественные соединения (NATURAL JOIN)
Естественным соединением называется соединение между двумя таблицами, в котором Oracle соединяет таблицы по одинаково называющемуся столбцу (столбцам) обеих таблиц (естественным образом!). Естественное соединение выполняется в том случае, если указано ключевое слово NATURAL.
Единственным совпадающим столбцом для таблиц emp и dept является столбец depnto,
SELECT ename, deptno, dname FROM emp NATURAL JOIN dept ORDER BY deptno;
| ENAME | DEPTNO | DNAME |
|---|---|---|
| CLARK | 10 | ACCOUNTING |
| KING | 10 | ACCOUNTING |
| MILLER | 10 | ACCOUNTING |
| JONES | 20 | RESEARCH |
| FORD | 20 | RESEARCH |
| ADAMS | 20 | RESEARCH |
| SMITH | 20 | RESEARCH |
| SCOTT | 20 | RESEARCH |
| WARD | 30 | SALES |
| TURNER | 30 | SALES |
| ALLEN | 30 | SALES |
| JAMES | 30 | SALES |
| BLAKE | 30 | SALES |
| MARTIN | 30 | SALES |
Нетрудно заменить, что естественные соединения позволяют в значительной степени упростить запросы с соединением за счет устранения псевдонимов таблиц и сравнений дл соединения.
Tags: Выборка данных из нескольких таблиц, JOIN
PL/SQL
tags: Администрирование Oracle DataBase || SQL & PL/SQL
Исходные коды проекта хранятся на github. Можете заводить Issue и Discussions, при необходимости.
Чтобы задать вопрос, добавить свои знания, исправить ошибки и неточности, пишите в телеграм чате.
Как вывести данные из двух таблиц в sql
До сих пор все наши запросы обращались к одной таблице. Однако SQL позволяет в одном запросе обращаться к нескольким таблицам. Именно это свойство и сделало язык SQL столь популярным.
Полное имя столбца в таблице фактически состоит из имени таблицы, за которым идет точка и имя столбца. (По правде говоря, вначале еще указывается и имя пользователя, но это скорее относится к правам доступа и мы вернемся к этому позднее). Примеры имен:
Salespeople.snum Salespeople.city Orders.odate
До этого в запросах мы опускали имена таблиц, потому что мы запрашивали только одну таблицу. Если мы хотим связать столбцы разных таблиц, то их надо указать с именами Salespeople.city или Customers.city, чтобы сервер мог их различать.
Предположим вы хотите увидеть комбинации торговых агентов и заказчиков по городам.Это делается так:
SELECT Customers.cname, Salespeople.sname, Salespeople.city FROM Salespeople, Customers WHERE Salespeople.city = Customers.city
Результат запроса:
cname sname city -------------------- ------- ---------- ТОО Рога и копыта Иванов Москва ОАО "Валют-транзит" Егоров Караганда
т.к. поле city имеется в таблицах Торговые агенты и Заказчики, имена таблиц должны использоваться как префиксы.
Как работает этот запрос? SQL Server проверяет каждую комбинацию строк двух таблиц и проверяет их на условие указанное в предложении WHERE. Если эта комбинация удовлетворяет ему, то она выводится.
Для объединения таблиц можно использовать любые условия, а не только равенство. Например:
SELECT Salespeople.sname, Customers.cname FROM Salespeople, Customers WHERE Salespeople.sname < Customers.cname AND Customers.rating < 200
sname cname -------- ------------------ Егоров ТОО Рога и копыта Иванов ТОО Рога и копыта Петров ТОО Рога и копыта Сидоров ТОО Рога и копыта Егоров ОАО "ООО" Иванов ОАО "ООО"
В принципе это не слишком полезный запрос. Он воспроизводит все комбинации имени продавца и имени заказчика так, что первый предшествует последнему в алфавитном порядке, а заказчик имеет рейтинг меньше 200.
Предположим, что мы хотим найти все заказы заказчиков, не находящихся в одном городе с агентом. Для этого требуется связать три таблицы:
SELECT Orders.onum, Customers.cname, Orders.cnum, Orders.snum FROM Salespeople, Customers, Orders WHERE Customers.city <> Salespeople.city AND Orders.cnum = Customers.cnum AND Orders.snum = Salespeople.snum
onum cname cnum snum ----- ---------------------------------- ----- ----- 3001 ОАО "Валют-транзит" 2008 1007 3002 ОАО "ООО" 2007 1004 3005 Фирма ХХХ 2003 1002 3006 AО Бендер и К 2002 1007 3007 Концерн "Дети лейтенанта Шмидта" 2004 1002 3008 Clemens 2006 1001 3009 AО Бендер и К 2002 1003 3010 Концерн "Дети лейтенанта Шмидта" 2004 1002 3011 Clemens 2006 1001
Теперь вы можете строить запросы к нескольким таблицам одновременно. Вы можете устанавливать любые критерии отбора записей и условия связывания таблиц - собственно то ради чего и создавался SQL. Далее мы обсудим использование комбинаций запросов, где один запрос будет производить вывод, который будет управлять работой другого запроса.