鉴于简单的数据库结构:
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连接并不是那么好。
答案 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中工作。