SQL и найти записи, которые не соответствуют критериям

#sql #oracle

#sql #Oracle

Вопрос:

Кто-нибудь может помочь мне со следующим утверждением. Я новичок в SQL и, возможно, не замечаю очевидного.

Я пытаюсь выполнить следующий запрос, есть таблица поставок с соответствующими столбцами (PROJECTNO, SUPPLIERNO) Я знаю, что мне не нужно отправлять ПОСЫЛКИ. перед именами, но это в конечном итоге приведет к многотабличному запросу.

 SELECT sup1.SHIPMENTS.PROJECTNO, sup2.SHIPMENTS.PROJECTNO
FROM SHIPMENTS sup1, SHIPMENTS sup2
WHERE sup1.SHIPMENTS.PROJECTNO = sup2.SHIPMENTS.PROJECTNO
AND sup1.SHIPMENTS.SUPPLIERNO <> sup2.SHIPMENTS.SUPPLIERNO;
  

Я продолжаю получать следующую ошибку.

 ORA-00904: "SUP2"."SHIPMENTS"."SUPPLIERNO": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 160 Column: 34
  

Заранее спасибо

Комментарии:

1. Добро пожаловать в Stack Overflow. Вы можете форматировать исходный код с помощью кнопки {} на панели инструментов. На этот раз я сделал это за вас.

Ответ №1:

Ваш запрос должен быть записан как:

 SELECT sup1.PROJECTNO, sup2.PROJECTNO
FROM SHIPMENTS sup1 JOIN
     SHIPMENTS sup2
     on sup1.PROJECTNO = sup2.SHIPMENTS.PROJECTNO AND
        sup1.SUPPLIERNO <> sup2.SUPPLIERNO;
  

Во-первых, при использовании псевдонима нет необходимости снова указывать имя таблицы. Кроме того, вы должны использовать явный join синтаксис с on условием. Поддерживается неявный синтаксис с условием в where предложении, но он менее мощный и более сложный для чтения.

Ответ №2:

Измените все sup2.SHIPMENTS.SUPPLIERNO на sup2.SUPPLIERNO и сделайте то же самое для псевдонима sup1 и для других столбцов.

Вы должны понимать псевдонимы. Как только вы создадите псевдоним table TAB как T, вы должны ссылаться на него просто как T.

В вашем предложении FROM, когда вы говорите

  FROM SHIPMENTS sup1, SHIPMENTS sup2
  

вы присваиваете таблице ОТГРУЗОК псевдоним sup1 и sup2 (как 2 экземпляра одной и той же таблицы). Итак, вам нужно использовать sup1 и sup2 в качестве имени таблицы, а реальное имя (ОТГРУЗКИ) недопустимо и в любом случае будет неоднозначным, поэтому используйте:

 sup1.SUPPLIERNO --refers to SUPPLIERNO column in SHIPMENTS table aliased as sup1
sup2.PRODUCTNO  --refers to PRODUCTNO column in SHIPMENTS table aliased as sup2
  

не существует такой вещи, как sup2.SHIPMENTS.SUPPLIERNO, потому что не существует такой вещи, как таблица sup2.SHIPMENTS

Кроме того, общее правило, которое следует иметь в виду, в Oracle вы можете использовать обозначения типа table.column, schema.table или schema.table.column для ссылки на таблицы / представления или столбцы. В этом случае то, что вы написали, равносильно table.table.column, что не имеет смысла (если вы не использовали вложенную таблицу).

Причина, по которой вы должны использовать псевдонимы здесь, заключается в том, что это единственный способ объединить таблицу с самой собой. Если вы дважды используете полное имя таблицы, вы получите ошибки неоднозначности. При самостоятельном объединении таблицы Oracle обрабатывает каждый экземпляр (псевдоним) как отдельную таблицу в запросе. Я предпочитаю использовать псевдонимы, такие как a и b, чтобы уменьшить количество опечаток.

  SELECT a.PROJECTNO, b.PROJECTNO
 FROM SHIPMENTS a JOIN SHIPMENTS b USING(PROJECTNO)
 WHERE a.SUPPLIERNO <> b.SUPPLIERNO;
  

Комментарии:

1. Спасибо, что исправил это.