000*_*000 3 performance sql-server primary-key query-performance
我想更新多条记录,但是设置的值基于给定记录的主键。这不是单个记录的问题,因为我可以使用:
UPDATE T1
SET A1 = (SELECT TOP 1 X FROM T2 WHERE Y = ID1)
WHERE A2 = ID1
Run Code Online (Sandbox Code Playgroud)
IN 运算符适用于 WHERE 子句,因为它会更新正确的列表,但不会在子查询中更新。在 SET 中,它将从 ID 列表中的所有值中获取前 1 个值,我只希望它用于相应的记录/ID。
使用:Microsoft T-SQL
谢谢你
不是为YandA2指定相同的 IN 列表,而是只为A2and指定它并使子查询与T1on相关T2.Y = T1.A2,如下所示:
UPDATE
dbo.T1
SET
A1 = (SELECT TOP 1 T2.X FROM dbo.T2 WHERE T2.Y = T1.A2)
WHERE
A2 IN (ID1, ID2, ...)
;Run Code Online (Sandbox Code Playgroud)
这样子查询将从T2与T1正在更新的行的键匹配的最上面选择行。
另请注意,使用TOP nwithoutORDER BY将导致选择任意行。如果Xper Yin可以有两个或多个不同的值T2,那么通过引入一个ORDER BY具有足够具体的排序标准集的子句来使结果具有确定性可能是个好主意。
另一方面,如果Xper 保持不变Y,则您可能在 中存储了冗余信息T2。也许,在这种情况下,您应该将X列移至T1,基于a) T2.Y似乎是对的引用T1.A2并且b) A2是 的主键的事实T1。
| 归档时间: |
|
| 查看次数: |
4985 次 |
| 最近记录: |