我需要从表中获取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真的很感激。
答案 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
,假设id
是PRIMARY 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。