2013-11-21 47 views
1

我正在使用Lucene對SQL數據的一個子集執行查詢,這些數據返回給我一個RecordID的評分列表,例如, 11,4,5,25,30。MSSQL ORDER BY合格表

我想使用此列表從RecordID檢索完整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)

我關心的是服務器負載的負載尤其是當我傳遞RecordIDs的長列表。有沒有人有這方面的經驗或如何確定最佳列表長度。

MSSQL中有沒有其他的方法來實現這個功能?

羅傑

+0

一般 - 這在處理Lucene搜索的應用層中會更快。 –

回答

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 
+0

是的,@ tSortOrder可以是一個表值參數。很好的解決方案。 – usr

+0

感謝您的建議。我使用了一個變體,從我的C#代碼創建「sortorder」表,然後使用Stored Procedure中的左連接。 – RogerDodge

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的小提琴

0

喜歡的東西:

SELECT * FROM MyFullRecord where RecordID in (11,5,3,25,30) 

ORDER BY 
    CHARINDEX(','+CAST(RecordID AS varchar)+',', 
       ','+'11,5,3,25,30'+',') 

SQLFiddle demo

+0

我不明白這是如何改善的。 – usr