MSSQL按顺序传递列表
我正在使用Lucene对SQL数据的子集执行查询,这会返回一个记录ID的计分列表,例如11,4,5,25,30 我想使用此列表通过RecordID从完整的SQL表中检索一组结果 所以MSSQL按顺序传递列表,sql,sql-server,Sql,Sql Server,我正在使用Lucene对SQL数据的子集执行查询,这会返回一个记录ID的计分列表,例如11,4,5,25,30 我想使用此列表通过RecordID从完整的SQL表中检索一组结果 所以从MyFullRecord中选择* 其中RecordID位于(11,5,3,25,30) 我希望检索到的列表能够保持评分顺序 我可以通过使用类似的命令来完成它 ORDER BY(当RecordID=11时为大小写,则为0 当RecordID=5时,则为1 当RecordID=3时,则为2 当RecordID=25时,
从MyFullRecord中选择*
其中RecordID位于(11,5,3,25,30)
我希望检索到的列表能够保持评分顺序
我可以通过使用类似的命令来完成它
ORDER BY(当RecordID=11时为大小写,则为0
当RecordID=5时,则为1
当RecordID=3时,则为2
当RecordID=25时,则为3
当RecordID=30时,则为4
结束)
我关心的是服务器的加载,尤其是当我传递记录ID的长列表时。是否有人对此有经验,或者我如何确定最佳列表长度
在MSSQL中是否有其他方法实现此功能
罗杰您可以将列表记录到具有排序优先级的表或表变量中。 然后将您的表与此排序表合并
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
您可以创建一个内存中的表来联接,而不是创建一个searched order by语句。它对眼睛更容易,而且绝对更容易缩放 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
找一把小提琴,比如:
SELECT * FROM MyFullRecord where RecordID in (11,5,3,25,30)
ORDER BY
CHARINDEX(','+CAST(RecordID AS varchar)+',',
','+'11,5,3,25,30'+',')
通常-在处理Lucene搜索的应用程序层中使用此选项会更快。我看不出这有什么改进。是的,@tSortOrder可能是一个表值参数。非常好的解决方案。谢谢你的建议。我使用了一个变体,从我的C#代码创建“sortorder”表,然后使用存储过程中的左连接。