删除具有子查询奇怪行为的语句

时间:2014-07-25 09:37:33

标签: sql sql-server

我有2个表,我正在执行一个删除语句。当我选择具有无效列名称的列时,它会引发错误。但是当我使用第一个表的列名时,它只删除记录。

//查询:

CREATE TABLE FOO (ID INT)
GO
CREATE TABLE FOOBAR (NUMBER INT)
GO

INSERT INTO FOO VALUES(1)
INSERT INTO FOO VALUES(2)
INSERT INTO FOO VALUES(3)
INSERT INTO FOOBAR VALUES(1)
GO

-- The following will raise an error
SELECT ID FROM FOOBAR WHERE NUMBER = 1
GO
--Server: Msg 207, Level 16, State 3, Line 1
--Invalid column name 'ID'.


-- The following statement will delete the entire table
DELETE FROM FOO WHERE ID IN
(SELECT ID FROM FOOBAR WHERE NUMBER = 1)
GO
--(3 row(S) affected)

当我使用别名时它工作正常。这是一个错误还是其他什么?

这是怎么发生的?

2 个答案:

答案 0 :(得分:2)

在以下语句中,内部选择将从表ID而不是表FOO获取列FOOBAR

DELETE FROM FOO WHERE ID IN
(SELECT ID FROM FOOBAR WHERE NUMBER = 1)

为了使这一点更加明显,您可以尝试将Alliases添加到表中并执行select而不是删除,只是为了查看结果:

SELECT * FROM FOO F WHERE ID IN
(SELECT F.ID FROM FOOBAR FB WHERE FB.NUMBER = 1)

答案 1 :(得分:0)

ID中没有名为FOOBAR的列。它有一列,称为NUMBER。您的select语句应如下所示:

SELECT NUMBER FROM FOOBAR WHERE NUMBER = 1;

要完成NUMBERFOOBAR中的ID等于FOO中的DELETE FROM FOO WHERE ID IN (SELECT NUMBER FROM FOOBAR WHERE NUMBER = 1); 所示的删除:

{{1}}