#sql #oracle
Вопрос:
Создал эту учетную запись только для того, чтобы задать этот вопрос после того, как не смог найти/израсходовать имеющиеся у меня местные ресурсы, поэтому я обращаюсь ко всем вам.
Я пытаюсь объединить две таблицы — ЗАКАЗЫ и КЛИЕНТ — в соответствии с вопросом моего задания
- Для каждого заказа укажите номер заказа и дату заказа, а также номер клиента, фамилию и имя клиента, разместившего заказ.
Поэтому я ищу номер заказа, дату, номер клиента и полное имя клиентов.
Код звучит так
SELECT ORDERS.ORDR_ORDER_NUMBER, ORDERS.ORDR_ORDER_DATE, ORDERS.ORDR_CUSTOMER_NUMBER, CUSTOMER.CUST_LAST, CUSTOMER.CUST_FIRST
FROM ORDERS, CUSTOMER
WHERE ORDERS.ORDR_CUSTOMER_NUMBER = CUSTOMER.CUST_CUSTOMER_NUMBER;
Я сделал этот код без идентификаторов таблиц, поместив кавычки вокруг ORDERS.ORDR_CUSTOMER_NUMBER, псевдонимы для двух таблиц и даже поместив пробел после ORDR_ в обоих SELECT amp; WHERE для смеха, и ничего не работает. Все они продолжают выдавать ошибку в названии (ORA-00904), в которой говорится, что [ORDERS.]ORDR_CUSTOMER_NUMBER является недопустимым идентификатором, хотя этого не должно быть.
Комментарии:
1. Пожалуйста, опубликуйте DDL для таблиц в виде текста в вашем вопросе, а не в виде изображения.
2. У вас нет СОЕДИНЕНИЯ в вашем SQL, поэтому вы не пытаетесь выполнить СОЕДИНЕНИЕ. SQL отказывается , это неправда; вы не просили, чтобы это СОЕДИНЕНИЕ выполнялось. Возможно, вам захочется вернуться к своим заметкам по курсу.
3. Кроме того, подсказка: в вашем заявлении никогда не должно быть запятой
FROM
. Если ваш учитель говорит, что вы должны это сделать, найдите нового учителя или класс.4. @KenWhite это явная неправда. Oracle по-прежнему поддерживает синтаксис соединения в старом стиле, и OP определенно написал соединение. Правда, это сделано старомодным и, возможно, неясным способом и менее самодокументировано, но это не делает его неправильным, как вы подразумеваете. Говорить, что операция никогда не должна использовать синтаксис старого стиля, непродуктивно-существует множество существующих SQL, которые его используют, поэтому знать об этом хорошо. Я действительно выступаю за использование современного синтаксиса соединения в стиле ANSI в целом. но использование старого стиля не является неправильным.
5. @Fan_of_Simon_Pegg что вы получаете, когда выполняете следующий запрос? Пожалуйста, отредактируйте вопрос, чтобы добавить его в результаты:
select table_name, column_name from all_tab_columns where table_name in ('ORDERS', 'CUSTOMER') order by table_name, column_id;
Ответ №1:
В любом случае, запрос, который выдает желаемый результат, должен иметь форму:
select
o.ordr_order_number,
o.ordr_order_date,
c.cust_customer_number,
c.cust_last,
c.cust_first
from orders o
join customer c on c.cust_customer_number = o.ordr_customer_number
Как вы видите, запрос становится намного проще для чтения и записи, если вы используете современный синтаксис объединения и используете псевдонимы таблиц ( o
и c
).
Ответ №2:
Вы должны добавить СОЕДИНЕНИЕ или ВНУТРЕННЕЕ СОЕДИНЕНИЕ в свой запрос. Поскольку данные поступают из двух разных таблиц, предложение WHERE не будет выбирать обе.
FROM Orders INNER JOIN Customers ON Orders.order_Customer_Number = Customer.Cust_Customer_Number
Комментарии:
1.
where
предложение достаточно для выполненияjoin
, посколькуinner join
является подмножеством (проекцией) декартового произведения двух наборов (партнеров по объединению). Хотя такие соединения трудно прочитать по сравнению с явнымJOIN
ключевым словом ANSI, Oracle использует их в своих приложениях (OeBS, HCM)