【问题标题】:SQL can not refer table in from clause within whereSQL 不能在 where 子句中引用表
【发布时间】:2022-01-13 11:59:15
【问题描述】:

我有一个在 oracle 11g 中使用的简单 SQL 查询

select something 
from sc 
where sc.column satisfies something

但我不能在 where 复合中引用 SC,任何人都可以帮助解释这一点,在此先感谢。

---第二次编辑:我在 oracle 19c 中测试了 sql 命令,但在 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.
          );

【问题讨论】:

  • 你的 rdbms 是什么?
  • 您能提供一些示例数据并期待结果吗?
  • A 在您的子选择之外定义了一个无法从那里访问的 id
  • 我用一个虚拟 SC 表运行它,它工作。请显示完整的错误信息和表定义。
  • @D-Shih 数据库是oracle 11g

标签: sql oracle


【解决方案1】:

如果您尝试获取不仅在 SNO 's001' 中的 CNO。

那么也许是这个。

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
      )

【讨论】:

    【解决方案2】:

    我会尝试使用 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.
    


    我假设你想返回没有匹配的地方?

    【讨论】:

    • 这段代码不能在oracle 11g上运行,但是最新版本19c是可以的。我想知道为什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    相关资源
    最近更新 更多