0

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

从本质上讲,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
)

这就是有趣的原因:UserAddresses没有名为UserID. 相关子查询正在选择它正在查询的表中不存在的列。

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

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

谁能解释一下?

4

2 回答 2

6

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

假设您在人口统计表中有 AddressId 并且做了:

DELETE FROM UserDemographics
WHERE AddressID IN ( SELECT AddressId FROM UserAddresses )

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

这个故事的寓意是: 在引用子查询中的列时,总是使用表名或别名。 以下得到您期望的错误:

DELETE FROM UserDemographics
WHERE UserID IN ( SELECT ua.UserId FROM UserAddresses ua)
于 2012-05-15T00:42:48.310 回答
0

表 UserAddresses 的 UserAddressID 实际上是 tableUserDemographics 的 UserID 的外键

因为你提出的价值观

所以你应该使用 UserAddressID

DELETE FROM UserDemographics
WHERE UserID IN
(
    SELECT UserAddressID FROM UserAddresses
)

但我的意思是这个脚本将删除所有在 UserAddresses 表中有地址的用户

在这种情况下,您应该添加一个 where 子句

DELETE FROM UserDemographics
WHERE UserID IN
(
    SELECT UserAddressID FROM UserAddresses where ???
)

除非您打算删除在 UserAddresses 表中有引用的任何用户

于 2012-05-15T08:24:37.147 回答