T-SQL查询有趣的行为

时间:2009-03-16 18:16:28

标签: sql sql-server sql-server-2005 tsql

假设您有以下两个表:

X表

X_ID Y_ID_F X_Value

1     1     Q
2     1     G
3     1     T
4     2     W
5     2     K
...

Y表

Y_ID Y_Value

1     A
2     B
...

您只想查询Y父级值为A的属性并更新它们,以便您按如下方式编写查询(我意识到有更好的查询但请耐心等待):


UPDATE X set X_Value = 'O' 
WHERE X_ID IN
(
select distinct X.X_ID FROM X
INNER JOIN Y ON X.Y_ID_F = Y.Y_ID
WHERE Y.Y_Value = 'A'
)

我以前认为这会做它看似说的:更新X表的行,其中连接的Y表的Y_Value ='A'。但是,似乎X.X_ID导致更新X表中的所有行,而不仅仅是您认为WHERE子句将其限制为的行。不知何故,X.X_ID导致查询完全忽略了where子句在限制更新行集时的尝试。关于为什么的任何想法?

编辑: 我认为它可能与我正在查询的数据库中的表的关联方式有关,而不是像我试图将其模糊的示例那样简单。

2 个答案:

答案 0 :(得分:3)

我从未在UPDATE语句中获得子选择。相反,尝试以下内容:

UPDATE X SET X_Value = 'O'
FROM Y
WHERE Y.Y_ID = X.Y_ID_F
  AND Y.Y_Value = 'A'

答案 1 :(得分:0)

这对我来说也没有任何意义,所以我试了一下。运行update语句后,表X的内容如下所示:

X_ID   Y_ID   X_VALUE
1      1      O
2      1      O
3      1      O
4      2      W
5      2      K

换句话说,我预期的结果。你确定这里没有其他工作吗?我确实注意到你的示例查询中有一个小的异常:在连接条件中引用'X.Y_ID_F',我希望看到'X.Y_ID'。我以为这只是一个错字。