SP:获得5个随机记录加1

时间:2009-07-21 13:00:26

标签: sql sql-server sql-server-2005 tsql stored-procedures

我需要从表中获取5个随机记录,并根据存储在第二个表中的用户首选项中的数据添加另一个记录。

以下是我目前创建的两个陈述:

根据TBL_MEMBERS中的键集获取最喜欢的慈善机构:

SELECT DISTINCT TBL_CHARITIES。* FROM TBL_CHARITIES在TBL_CHARITIES.cha_Key = TBL_MEMBERS.members_Favourite WHERE TBL_MEMBERS.members_Id = 16

上加入TBL_MEMBERS

获取5个随机慈善机构:

SELECT TOP 5 * FROM TBL_CHARITIES WHERE cha_Active ='TRUE'AND cha_Key!='1'ORDER BY NEWID();

在存储过程中使用时,它只将第一个SELECT语句返回到我的.Net页面。如何在确保不重复结果的同时合并这两个陈述(例如,5个随机记录中不存在最爱?

非常感谢!


确定!所以现在我已经更新了东西并得到了以下内容:

CREATE PROCEDURE web.getRandomCharities ( @tmp_ID bigint --members ID ) AS BEGIN

WITH    q AS
 (
 SELECT  TOP 5 *
 FROM    TBL_CHARITIES
 WHERE   cha_Active = 'TRUE'
         AND cha_Key != '1'
 ORDER BY NEWID()
 )

SELECT * FROM q 
 UNION ALL 
 SELECT TOP 1 * FROM ( 
         SELECT * FROM TBL_CHARITIES WHERE TBL_CHARITIES.cha_Key IN 
         ( SELECT members_Favourite FROM TBL_MEMBERS WHERE members_Id = @tmp_ID )        EXCEPT SELECT * FROM q ) tc

END

现在我需要能够记录“cha_Key =='1'”,但前提是它不是用户最喜欢的。这可能吗?

感谢目前为止所做的一切。 IT真的很感激。

4 个答案:

答案 0 :(得分:1)

只需UNION ALL他们:

 WITH    q AS
         (
         SELECT  TOP 5 *
         FROM    TBL_CHARITIES
         WHERE   cha_Active = 'TRUE'
                 AND cha_Key != '1'
         ORDER BY NEWID()
         )
 SELECT  *
 FROM    q
 UNION ALL
 SELECT  TOP 1 *
 FROM    (
         SELECT  *
         FROM    TBL_CHARITIES
         WHERE   TBL_CHARITIES.cha_Key IN
                 (
                 SELECT  members_Favourite
                 FROM    TBL_MEMBERS
                 WHERE   members_Id = 16
                 )
         EXCEPT
         SELECT  *
         FROM    q
         ) tc

<强>更新

不幸的是,上面的查询无法按预期运行,因为CTE中的SQL Server被重新评估,q的第二个实例将提供不同的记录。

有关详细信息,请参阅我的博客中的这篇文章:

您需要重写查询:

 WITH    q AS
         (
         SELECT  TOP 5 *
         FROM    TBL_CHARITIES
         WHERE   cha_Active = 'TRUE'
                 AND cha_Key != '1'
         ORDER BY
                 NEWID()
         ),
         r AS
         (
         SELECT  *
         FROM    TBL_CHARITIES
         WHERE   TBL_CHARITIES.cha_Key IN
                 (
                 SELECT  members_Favourite
                 FROM    TBL_MEMBERS
                 WHERE   members_Id = 16
                 )
         )
 SELECT  TOP 6 *
 FROM    q
 FULL OUTER JOIN
         r
 JOIN    TBL_CHARITIES t
 ON      t.id = COALESCE(q.id, r.id)
 ORDER BY
         q.id

,假设idPRIMARY KEY的{​​{1}}。

答案 1 :(得分:0)

我建议将ID列表下拉到.Net页面,然后使用后台代码随机选择N个ID,并将其作为参数传递给您的查询。您可以在查询中使用where id != BL_MEMBERS.members_Favourite排除用户的收藏夹,该查询会检索现有ID。

这使您可以相当容易地增加/减少随机选择项目的数量,并移动随机生成并检查.Net中的唯一项目,以便更轻松地完成。

答案 2 :(得分:0)

试试这个

 SELECT  *
 FROM    (
         SELECT  TOP 5 *
         FROM    TBL_CHARITIES
         WHERE   cha_Active = 'TRUE'
                 AND cha_Key != '1'
         AND cha_Key not in(SELECT  TBL_MEMBERS.members_Favourite
            WHERE   TBL_MEMBERS.members_Id = 16)
         ORDER BY NEWID()
         ) q
 UNION ALL
 SELECT  TOP 1 TBL_CHARITIES.*
 FROM    TBL_CHARITIES
 WHERE   TBL_CHARITIES.cha_Key IN
         (
         SELECT  TBL_MEMBERS.members_Favourite
         FROM    TBL_MEMBERS
         WHERE   TBL_MEMBERS.members_Id = 16
         )

答案 3 :(得分:0)

使用参数@Memeber_ID创建存储过程。

然后做一些Quassnoi所说的代码类型,并做了一些修改。

所以,拉出前5个记录,但是添加到TBL_MEMBERS的连接,并且记录所取的where子句不能是memeber_ID的选择。然后为成员选择做一个UNION。