我有四张桌子:(如下图所示)
- 主题白柱:
- ID
- 首要的关键
- 整数
- 类别ID
- 对表类别的引用
- 整数
- 用户身份
- 对表用户的引用
- nvarchar(128)
- ID
- 具有列的用户:
- ID
- 首要的关键
- nvarchar(128)
- ID
- 类别白栏
- ID
- 首要的关键
- 整数
- ID
- UserCategoryLink 与列
- 用户身份
- 首要的关键
- 对表用户的引用
- nvarchar(128)
- 类别ID
- 首要的关键
- 对表类别的引用
- 整数
- 用户身份
我将更新表主题,以便 CategoryID 是表 UserCategoryLink 的 CategoryID 之一。
PS:我使用 MS SQL Server。
第3次更新:就像您在此SQL Fiddle上看到的那样,每个用户的主题表单中的类别不包含在表 UserCategoryLink 中,但它必须包含!所以马克只能有自行车和滑雪的主题,而不是摩托车和游泳。现在,我将从表 UserCategoryLink 中的 CategoryID 列中将所有错误的(也可以更新的)行更新为一个 ID。
第一次更新:我尝试了以下代码
;WITH rs AS
(
SELECT UserID as Sid, CategoryID as Cid
FROM UserCategorieLink
)
update Topic
set CategoryID = (select top 1 Cid from rs where UserID = Sid)
where UserID = (select top 1 Sid from rs where UserID = Sid);
但结果并不是每个用户最喜欢的类别随机选择的。我知道它来自,top 1
但这是因为我不知道如何生成随机数。
我将从 select 语句中随机取一行(参见下面的代码/就像我可以在 C# 等编程语言中做的那样),但它给了我一个错误,因为RAND
生成了一个介于 0 和 1 之间的随机数。
RAND(select top 1 Cid from rs where UserID = Sid)
错误是:
关键字“select”附近的语法不正确
和
')' 附近的语法不正确。
在第 7行。
第 2 次更新:代码还为来自同一用户的每个主题提供了相同的随机数。那也可以是随机数吗?我知道每个用户总是有两个最喜欢的类别。查询必须选择其中之一。
我知道它来自where
更新语句的子句。但是我该如何解决呢?
不会完成您要完成的工作,但对于您的更新,您使用的是
TOP
没有ORDER BY
. 虽然 SQL Server 不保证此类查询的顺序,但它也不只是随机选择。如果要强制返回随机行,则需要按行级随机数排序。为此,您可以使用ORDER BY ABS( CHECKSUM( NEWID() ) )
.试一试
sys.objects
以查看显式随机排序的行为。不管你在做什么,祝你好运。
编辑:
@jean 在评论
NEWID()
中指出,这就是所有必要的,这是 100% 正确的,我只是肌肉记忆,ABS( CHECKSUM() )
因为我倾向于使用操作员进行行级随机化%
。编辑2:
那么这样的事情呢?