我使用Lucene对SQL数据的子集执行查询,该子集返回记录I的得分列表,例如11、4、5、25、30。
我想使用这个列表从完整的SQL中检索一组结果。
所以SELECT * FROM MyFullRecord   where RecordID in (11,5,3,25,30)
我希望检索到的列表能保持评分顺序。
我可以用这样的命令来做到这一点;
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)
我关注的是服务器加载的加载,特别是当我传递记录I的长列表时。有没有人有这方面的经验,或者我如何确定一个最佳的列表长度。
在MSSQL中还有其他实现此功能的方法吗?
罗杰
发布于 2013-11-21 11:49:59
可以将列表记录到具有排序优先级的表或表变量中。然后用这个排序表连接你的桌子。
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发布于 2013-11-21 11:53:57
您可以创建一个要加入的内存表,而不是创建已搜索的order语句。这对眼睛来说更容易,而且比例也更好。
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看这里的小提琴
https://stackoverflow.com/questions/20120047
复制相似问题