我创建了两个表,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行
答案 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); - 无效的标识符