Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MSSQL按顺序传递列表_Sql_Sql Server - Fatal编程技术网

MSSQL按顺序传递列表

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时,

我正在使用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时,则为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”表,然后使用存储过程中的左连接。