我正在使用Lucene对SQL数据子集执行查询,该数据返回一个RecordID的得分列表,例如: 11,4,5,25,30。
我想使用此列表从RecordIDs的完整SQL表中检索一组结果。
所以SELECT * FROM MyFullRecord
where RecordID in (11,5,3,25,30)
我希望检索到的列表能够维持评分顺序。
我可以通过像这样使用Order来实现;
ORDER BY (CASE WHEN RecordID = 11 THEN 0
WHEN RecordID = 5 THEN 1
WHEN RecordID = 3 THEN 2
WHEN RecordID = 25 THEN 3
WHEN RecordID = 30 THEN 4
END)
我担心加载服务器加载,特别是如果我传递长的RecordID列表。有没有人有这方面的经验或如何确定最佳列表长度。
在MSSQL中是否还有其他方法可以实现此功能?
罗杰
答案 0 :(得分:2)
您可以将列表记录到具有排序优先级的表或表变量中。 然后加入你的表与这个排序。
DECLARE TABLE @tSortOrder (RecordID INT, SortOrder INT)
INSERT INTO @tSortOrder (RecordID, SortOrder)
SELECT 11, 1 UNION ALL
SELECT 5, 2 UNION ALL
SELECT 3, 3 UNION ALL
SELECT 25, 4 UNION ALL
SELECT 30, 5
SELECT *
FROM yourTable T
LEFT JOIN @tSortOrder S ON T.RecordID = S.RecordID
ORDER BY S.SortOrder
答案 1 :(得分:1)
您可以创建一个内存表来加入,而不是按语句创建搜索顺序。它在眼睛上更容易,并且可以更好地扩展。
SQL声明
SELECT mfr.*
FROM MyFullRecord mfr
INNER JOIN (
SELECT *
FROM (VALUES (1, 11),
(2, 5),
(3, 3),
(4, 25),
(5, 30)
) q(ID, RecordID)
) q ON q.RecordID = mfr.RecordID
ORDER BY
q.ID
看here寻找小提琴
答案 2 :(得分:0)
类似的东西:
SELECT * FROM MyFullRecord where RecordID in (11,5,3,25,30)
ORDER BY
CHARINDEX(','+CAST(RecordID AS varchar)+',',
','+'11,5,3,25,30'+',')