SQL Server,从表中选择随机项,其中id用于另一个表

时间:2010-12-15 10:18:50

标签: sql-server join random

鉴于简单的数据库结构:

Account
   - Id (Primary Key)

Root
   - Id (Primary Key)
   - AccountId (FK to Account)
   - Private (bit)

RootItem
   - Id (Primary Key)
   - AccountId (FK to Account)
   - RootId (FK to Root)

有谁知道如何编写SQL语句来执行以下操作?

鉴于我只知道某人的Account.Id为int,我们可以说@AccountId = 1。 选择一个随机根记录,其中附加的RootItem记录具有AccountId = @AccountID且Root.Private = 0。

这是针对SQL Server的,任何帮助都会受到赞赏,我对SQL连接并不是那么好。

1 个答案:

答案 0 :(得分:2)

select top 1 *
from
    Root r
        left join
    RootItem ri
        on
            r.Id = ri.RootID and
            ri.AccountId = @AccountID
where
    r.Private = 0 and
    ri.Id is null
order by
    newid()

要消除RootItems与帐户ID匹配的Roots,我们在上面执行左连接,但是在where子句中,我们确保(ri.Id为null)实际上没有匹配。要随机选择一行,我们按newid()排序,它会为每一行生成一个新的GUID,然后只选择前一行。

如果我们需要更强的随机性来源或一些好的统计属性,我们可能需要考虑在CLR中工作。