解释嵌套 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 值用作常量值。
我有一个场景,我需要使用嵌套 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 值用作常量值。