以正确的顺序从其他表中获取包含ID的行

时间:2012-08-30 09:06:32

标签: sql sql-server tsql sql-server-2005

我有两个表,PostsCache

Cache表保存了我应该显示的帖子。帖子ID保存在PostIDs表格中的Cache列中,以逗号(,)分隔。

这是我的代码:

SELECT * FROM Posts a
WHERE ID IN 
(
  SELECT item FROM Cache AS b
  CROSS APPLY dbo.fnSplit(b.postIDs, ',') 
  WHERE ((b.ownerID = 1) AND (b.magID = 8))
)

此外fnSplit工作正常。

但问题是,帖子的顺序不正确。

例如,如果我们在Cache5,1,9,4,10,3中有此字符串,我希望从Posts获得该订单的帖子。 (第一行应该是ID为5的帖子,然后是1,然后是9,然后是4,......)

但我的代码以其他顺序返回帖子:1,3,4,5,9,10Posts表中的行顺序)

我应该怎样做(纯SQL)以Cache表中指定的顺序获取项目? (在该示例中,我希望按此顺序获得帖子:5,1,9,4,10,3

1 个答案:

答案 0 :(得分:1)

根据您的示例,这应该有效(其中cacheorder是您要按顺序排序的字段)

SELECT * FROM Posts a 
     inner join 
     ( 
        SELECT item, cacheorder FROM Cache AS b 
        CROSS APPLY dbo.fnSplit(b.postIDs, ',')  
        WHERE ((b.ownerID = 1) AND (b.magID = 8)) 
     ) v
     ON a.ID = v.item
ORDER BY CacheOrder

然而

  • 没有固有的保证记录顺序 - 如果您需要特定订单,则必须指定
  • 如果您在逗号分隔字段中存储postID,则数据库设计存在缺陷。