相关的子查询应该抛出异常

Dav*_*ths 0 sql-server

抱歉标题不好 - 我想不出更好的标题.

从本质上讲,SQL Server 2008正在处理我希望失败的子查询.

这是一个简单的例子:

CREATE TABLE UserDemographics
(
    UserID      INT,
    UserName    NVARCHAR(500)
)

CREATE TABLE UserAddresses
(
    UserAddressID   INT,
    Address     NVARCHAR(500)
)


INSERT INTO UserDemographics(UserID, UserName) VALUES(1, 'Joe'), (2, 'Sam'), (3, 'Ed')

INSERT INTO UserAddresses(UserAddressID, Address) VALUES(1, '1st Street'), (2, 'Old Address 1'), (3, 'Old Address 2')

DELETE FROM UserDemographics
WHERE UserID IN
(
    SELECT UserID FROM UserAddresses
)
Run Code Online (Sandbox Code Playgroud)

这就是为什么这很有趣:UserAddresses没有一个名为的列UserID.相关子查询正在选择它正在查询的表中不存在的列.

显然,它与相关子查询有关 - UserID是UserDemographics表中的一列,由于某种原因,数据库正在进行该引用.

也许该UserDemographics表隐含在子查询的from-list中.

有谁能解释一下?

Gor*_*off 6

是.相关子查询采用UserDemographics.Userid,因为这是范围内唯一的UserId.

想象一下,你在人口统计表中有AddressId,并做了:

DELETE FROM UserDemographics
WHERE AddressID IN ( SELECT AddressId FROM UserAddresses )
Run Code Online (Sandbox Code Playgroud)

在这种情况下,子查询中的AddressId将来自UserAddresses.

这个故事的寓意是: 在引用子查询中的列时始终使用表名或别名. 以下内容会出现您所期望的错误:

DELETE FROM UserDemographics
WHERE UserID IN ( SELECT ua.UserId FROM UserAddresses ua)
Run Code Online (Sandbox Code Playgroud)