SQL не может ссылаться на таблицу в предложении from внутри, где

#sql #oracle

#sql #Oracle

Вопрос:

У меня есть простой SQL-запрос, используемый в oracle 11g

 select something  from sc  where sc.column satisfies something  

но я не могу ссылаться на SC в разделе where composite, любой может помочь объяснить это, заранее спасибо.

—второе редактирование: я протестировал команду sql в oracle 19c, она работает, но в 11g она не работает.

содержание таблицы

 create table sc( sno varchar2(10), cno varchar2(10), score number(4,2), constraint pk_sc primary key (sno,cno) );  

примеры данных

 insert into sc values ('s001','c001',78.9); insert into sc values ('s002','c001',80.9); insert into sc values ('s003','c001',81.9); insert into sc values ('s004','c001',60.9); insert into sc values ('s001','c002',82.9); insert into sc values ('s002','c002',72.9); insert into sc values ('s003','c002',81.9); insert into sc values ('s001','c003','59');  

команда sql

 SELECT SNO FROM SC A WHERE 0 = (SELECT COUNT(*)   FROM   (SELECT B.CNO   FROM SC B  WHERE B.SNO = 's001'  MINUS  SELECT C.CNO   FROM SC C  WHERE A.SNO = C.SNO) --this is the error location, oracle reports invalid identifier A.  );  

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

1. Что у вас за СУБД?

2. Не могли бы вы предоставить некоторые примеры данных и ожидать результата?

3. A определяется за пределами вашего подвыборки, идентификатор, недоступный оттуда

4. Я запустил это с помощью фиктивного стола SC, и это сработало. Пожалуйста, покажите полное сообщение об ошибке и определение таблицы.

5. База данных @D-Shih-это oracle 11g

Ответ №1:

Я бы попробовал предложение exists вместо where 0 =

 SELECT SNO FROM SC A WHERE not exists (SELECT B.CNO   FROM SC B  WHERE B.SNO = 's001'  MINUS  SELECT C.CNO   FROM SC C  WHERE A.SNO = C.SNO) --this is the error location, oracle reports undefined A.  

Я предполагаю, что вы хотите вернуться туда, где нет совпадения?

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

1. этот код не может работать на oracle 11g, но последняя версия 19c в порядке. Я хочу знать, почему.

Ответ №2:

Если вы пытаетесь получить CNO, которые находятся не только в SNO «s001».

Тогда, может быть, это.

 SELECT DISTINCT SNO, cno FROM SC sc WHERE SNO = 's001'  AND EXISTS (  SELECT 1   FROM SC sc2  WHERE sc2.CNO = sc.CNO  AND sc2.SNO != sc.SNO  )