我有这样的表:
ID | City | Prize |
----------------------------
1 |Surabaya | HP
2 |Surabaya | Watch
3 |Surabaya | Bag
4 |Semarang |
5 |Semarang |Watch
6 |Semarang |
7 |Bandung |
8 |Bandung |
9 |Bandung |
我的问题是如何为填写奖品列创建更新查询,其中城市 = '(已在设置中)' AND ID = 随机。
例如:我希望更新填写城市 = '万隆' 但 ID = '随机' 可能 (7,8,9)。
我希望你知道我的意思。
我非常感谢你的建议
谢谢
简单的解决方案是具体化标识要更新的行的查询结果,并使用标量子查询获取该结果......
这会从所需的一组行中从表中选择一个随机 id,将其具体化为具有别名“dt1”的派生表,其中包含一行和一列(新获胜者的 id),然后使用子查询选择该 id并在外部 where 子句中使用它来更新行。
除非每个人都已经拥有一块手表,否则 0 行不会受到影响,因为我们从潜在获胜者列表中选择了“随机优先”的 id。
样品小提琴
您只想一次更新 1 个值,对吗?
为了更新现有值,您需要生成一个包含可能值和可选值的表,类似于我添加到@table 中的计数器。原因是您可能并不总是有没有奖品的连续 ID。以“三宝垄”为例。所以我们使用 IDENTITY 强制一个序列。
然后,我们将针对 IDENTITY 列选择一个随机数,以便始终选择现有值。
编辑
没有简单的功能可以满足您的需求,除非您始终不介意(0 行受影响) 。
让我再解释一下。您想为此查看“三宝垄”。
您需要查看 ID 4 和 6 才能获得奖品。5已经有奖了。
您SELECT RANDOM NUMBER它返回 157862,由于数字超出范围,因此不会进行更新。
您选择 RANDBETWEEN 4 和 6它返回 5,不会进行更新。
因此,现在您获取需要更新的 ID,并向它们添加序列号。所以让我们直接更新,你仍然需要某种类型的临时表,所以让我们使用 CTE