需要从一个表中查找随机记录,然后使用此记录加入另一个表

时间:2012-11-16 15:16:29

标签: sql sql-server join newid

背景:我正在开发一个简单的在线测验。在用户回答了一个简单的问题后,用户就有机会通过执行小任务来提高获胜机会。

用户获得的每一批都被插入一个单独的行,所以当我需要找到一个“随机”的批次时,他们获胜的机会就会增加(如果我错了,请纠正我)。

批次表中的样本数据:

LotId      ParticipantId      Created
1          1                  2012-11-16 12:00:00
2          2                  2012-11-16 12:02:00    
3          2                  2012-11-16 12:06:00 
4          2                  2012-11-16 12:15:00    
5          3                  2012-11-16 12:16:00

这意味着参与者2的参与者有三个地段,因此与其他参与者相比,获胜的机会更大。

我需要做什么:当我需要画一个胜利者时,我会从拍品表中选择一个随机拍品。在此之后,我需要找到有关获胜者的信息。

目前我使用以下SELECT(对改进SELECT的任何评论都很感激),然后在我的代码中我有另一个SELECT和用户的信息。

SELECT TOP 1 LotId, ParticipantId FROM Sample_Lots WITH (NOLOCK)
WHERE
    CAST(Created AS DATE) = '2012-11-16'
    AND
    ParticipantId NOT IN
    (
        SELECT ParticipantId FROM Sample_Winners WITH (NOLOCK)
        WHERE
            ParticipantId IS NOT NULL
            AND
            CAST(ThisDate AS DATE) = '2012-11-16'
    )
    AND
    ParticipantId IN
    (
        SELECT ParticipantId FROM Sample_Participants WITH (NOLOCK)
        WHERE
            ParticipationConfirmed IS NOT NULL
    )
ORDER BY NEWID()

我无法解决这个问题。我需要一个随机的批次,从这个随机批次我需要在同一个SELECT中获取用户的信息。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

假设您的用户信息在名为Participants的表中找到,其中包含ParticipantId,FirstName和LastName列,以下是使用该表的JOIN的示例:

SELECT TOP 1 sl.LotId, sl.ParticipantId, p.FirstName, p.LastName 
FROM Sample_Lots sl 
INNER JOIN Participants p ON sl.ParticipantId = p.ParticipantId WITH (NOLOCK)
WHERE
    CAST(Created AS DATE) = '2012-11-16'
    AND
    sl.ParticipantId NOT IN
    (
        SELECT ParticipantId FROM Sample_Winners WITH (NOLOCK)
        WHERE
            ParticipantId IS NOT NULL
            AND
            CAST(ThisDate AS DATE) = '2012-11-16'
    )
    AND
    sl.ParticipantId IN
    (
        SELECT ParticipantId FROM Sample_Participants WITH (NOLOCK)
        WHERE
            ParticipationConfirmed IS NOT NULL
    )
ORDER BY NEWID()

答案 1 :(得分:0)

在第一次选择中,将Sample_Lots左连接到ParticipantId列上的Participant表。然后在第一个选择中,您还可以获得有关参与者的详细信息。结果将与原始选择具有相同的行数,并将随机排序。