删除语句 - 子查询应该抛出错误

时间:2012-12-26 06:05:17

标签: sql oracle subquery delete-row

我创建了两个表,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 number); - 创建表格

     

创建表t2(xyz数字); - 创建表格

     

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

     

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

     

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

     

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

     

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

     

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

2 个答案:

答案 0 :(得分:11)

如果您使用表名作为别名以确保选择了表t2列,您​​将收到错误,即

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

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

答案 1 :(得分:1)

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

如果您看到这些查询

从t1中选择*,其中abc in(SELECT abc from t2); - 它会给出2行

从t1中选择*,其中abc in(SELECT 1 from t2); - 它会给出1行

从t1中选择*,其中abc in(SELECT 2 from t2); - 它将检索第二行

从t1中选择*其中abc in(SELECT 3 from t2); - 得到数据

从t1中选择*,其中abc in(SELECT hg from t2); - 无效的标识符