我有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)
当我使用别名时它工作正常。这是一个错误还是其他什么?
这是怎么发生的?
答案 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;
要完成NUMBER
中FOOBAR
中的ID
等于FOO
中的DELETE FROM FOO WHERE ID IN
(SELECT NUMBER FROM FOOBAR WHERE NUMBER = 1);
所示的删除:
{{1}}