解释嵌套 select 中父列的作用

Explain the effect of a parent column in a nested select

我有一个场景,我需要使用嵌套 select 的结果从 table 中删除行。像这样:

DECLARE @tbl_big TABLE (bigID int);

INSERT INTO @tbl_big (bigID) 
VALUES (1),(2),(3),(4),(5);

DECLARE @tbl_small TABLE (smallID int);

INSERT INTO @tbl_small (smallID) 
VALUES (1),(2),(3);

DELETE FROM @tbl_big 
WHERE (bigID IN (SELECT smallID FROM @tbl_small));

SELECT * 
FROM @tbl_big; -- shows 4,5 as expected

然而,在开发过程中,我不小心打错了字:

DELETE FROM @tbl_big WHERE (bigID IN (SELECT bigID FROM @tbl_small));  --bigID used instead of smallID

SELECT * 
FROM @tbl_big; -- no rows

结果是删除了父 table 中的 所有 行。

虽然这个 可能 完全可以接受 table T-SQL,但我从未见过它像这样应用,我也不希望声明鉴于 @tbl_small 不包含 bigID 列,甚至可以编译。

任何人都可以澄清一下 why/how 这有效吗,它是否有效 T-SQL?此外,您能否提供一个真实世界的示例,说明它比 risky(!) 更有用?

您提到的 DELETE 语句中的

bigID 引用了 @tbl_big 因为在您编写的子查询中提及主 table 中的列是合法的WHERE 子句。例如,您可以编写以下内容: DELETE FROM @tbl_big WHERE (bigID IN (SELECT smallID FROM @tbl_small WHERE smallID = bigID));

因此,在您的情况下,您只是将子查询中 table 中的所有 bigID 值用作常量值。