【问题标题】:SP: Get 5 random records plus 1SP:获得 5 条随机记录加 1
【发布时间】:2009-07-21 13:00:25
【问题描述】:

我需要从一个表中获取 5 条随机记录,以及基于存储在第二个表中的用户偏好数据的另一条记录。

这是我目前创建的两个语句:

根据 TBL_MEMBERS 中的密钥集获得最喜欢的慈善机构:

SELECT DISTINCT TBL_CHARITIES.* FROM TBL_CHARITIES JOIN TBL_MEMBERS ON TBL_CHARITIES.cha_Key = TBL_MEMBERS.members_Favourite WHERE TBL_MEMBERS.members_Id = 16

随机获得 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'”,但前提是它不是用户最喜欢的。这可能吗?

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

【问题讨论】:

  • 两个 SELECT 语句的结果应返回到您的 .NET 应用程序。您需要使用 DataSet,结果存储在 DataSet.DataTables 中。
  • 我如何通过 TBL_CHARITIES.cha_Key 订购?
  • 您最好只编辑原始问题并提供更多详细信息。 meta.stackexchange.com/questions/7771/…
  • 我意识到了这一点,并在不久之后对其进行了更新。谢谢。

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


【解决方案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

,假设idTBL_CHARITIESPRIMARY KEY

【讨论】:

  • 这不处理规范中的“无重复”部分。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    试试这个

     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
             )
    

    【讨论】:

    • 在第一个查询中添加条件会限制集合超出@op 的要求。随机的cha_Key 也可以是最喜欢的,这就是限制第二组的重点。
    • 而且您在复制查询时没有修复FROM 子句;)
    【解决方案4】:

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

    然后对Quassnoi所说的代码类型进行一些修改。

    所以,拉出前 5 条记录,但添加一个连接到 TBL_MEMBERS 和 where 子句,拉出的记录不能是 memeber_ID 的选择。然后对该成员选择执行 UNION。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2015-01-14
      相关资源
      最近更新 更多