2012-12-26 36 views
8

我已经创建了两个表,T1和T2各有一列,分别为abc和xyz。我在每个表格中插入了2行(数值1和2)。删除语句 - 子查询应该抛出错误

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

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

create table t1(abc number); - 创建表

create table t2(xyz number); - 创建表格

insert into t1 values(1); - 一行插入

insert into t1 values(2); - 一行插入

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

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

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

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

+3

我想这是因为'DELETE'语句中的'abc'意味着't1'中的'abc' – luiges90

+0

尝试在最后一个查询中运行select以确认哪些是返回的行,然后您将有更好的主意哪些abc值正在返回 –

+0

感谢您的答复。当我使用别名“从t1中删除abc in(在t2中选择t2.abc)时,它会抛出一个错误。但是不应该抛出一个错误,即使没有这个错误,因为我已经使用了”select abc from t2“? – Orangecrush

回答

11

如果使用表名作为别名,以确保t2表列得到选择,你会得到错误即

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

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

1

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

如果你看到这些查询

SELECT * FROM T1其中ABC中(选择T2 ABC); - 它会给出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); - 无效的标识符