SQL отказывается выполнять объединение, даже если каждый идентификатор действителен? (ORA-00904)

#sql #oracle

Вопрос:

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

Я пытаюсь объединить две таблицы — ЗАКАЗЫ и КЛИЕНТ — в соответствии с вопросом моего задания

  1. Для каждого заказа укажите номер заказа и дату заказа, а также номер клиента, фамилию и имя клиента, разместившего заказ.

Поэтому я ищу номер заказа, дату, номер клиента и полное имя клиентов.

Код звучит так

 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)