8

我创建了两个表,T1 和 T2,每个表都有一列,分别是 abc 和 xyz。我在每个表中插入了 2 行(数值 1 和 2)。

当我运行命令"select abc from t2"时,它会抛出一个错误,指出表 T2 中不存在列 abc。但是,当我运行命令时"delete from t1 where abc in (SELECT abc from t2);",会删除 2 行。

不应该删除失败,因为我使用了在子查询中失败的相同语句吗?

创建表 t1(abc 编号);--创建的表

创建表 t2(xyz 编号);--创建的表

插入 t1 值 (1); --插入一行

插入 t1 值 (2); --插入一行

插入 t2 值 (1); --插入一行

插入 t2 值 (2); --插入一行

从 t2 中选择 abc;--ORA-00904 -> 因为列 abc 在 t2 中不存在

从 t1 中删除 abc in (SELECT abc from t2); --2 行已删除

4

2 回答 2

11

如果您使用表名作为别名来确保表 t2 列被选中,您将收到错误,即

 delete from t1 where abc in (SELECT t2.abc from t2); --ORA-00904 

您的原始查询没有失败,因为它使用表的abc列,t1 因为表t1在子查询中可见。

于 2012-12-26T06:16:58.330 回答
1

由于您在 Where 条件中使用了 abc 列名,因此您的 Delete 语句正在工作。子查询基于 where 条件列执行,因为我们不使用表别名。

如果你看到这些查询

select * from t1 where abc in (SELECT abc from t2); -- 它会给出 2 行

select * from t1 where abc in (SELECT 1 from t2); -- 它会给出 1 行

select * from t1 where abc in (SELECT 2 from t2); -- 它将检索第二行

select * from t1 where abc in (SELECT 3 from t2); -- 不会得到 d 数据

select * from t1 where abc in (SELECT hg from t2); - 不合法的识别符

于 2012-12-26T09:41:07.187 回答