按照sql中提供的Id按数据排序

时间:2017-01-23 05:49:51

标签: sql sql-server sql-order-by

查询:

SELECT *
FROM [MemberBackup].[dbo].[OriginalBackup]
where ration_card_id in
(
1247881,174772,
808454,2326154
)

现在,数据按自动ID或我按顺序传递的任何子句排序。

但是我希望数据按顺序格式按照我已经传递的id传递

预期输出:

All Data for 1247881
All Data for 174772
All Data for 808454
All Data for 2326154

注意: 要传递的身份证数量为300 000

3 个答案:

答案 0 :(得分:1)

一种选择是创建一个CTE,其中包含ration_card_id值和您要施加的订单以及此表的连接:

WITH cte AS (
    SELECT 1247881 AS ration_card_id, 1 AS position
    UNION ALL
    SELECT 174772, 2
    UNION ALL
    SELECT 808454, 3
    UNION ALL
    SELECT 2326154, 4
)

SELECT t1.*
FROM [MemberBackup].[dbo].[OriginalBackup] t1
INNER JOIN cte t2
    ON t1.ration_card_id = t2.ration_card_id
ORDER BY t2.position DESC

修改

如果您有很多ID,那么上面的答案和使用CASE表达式给出的答案都不够。在这种情况下,最好的办法是将ID列表加载到一个包含自动增量ID列的表中。然后,每个数字都会标记一个位置,因为它的记录正在加载到您的数据库中。在此之后,您可以像我上面那样加入。

答案 1 :(得分:0)

如果所需的顺序不反映某些预先存在的数据的顺序排序,则必须自己指定顺序。一种方法是使用案例陈述:

SELECT *
FROM [MemberBackup].[dbo].[OriginalBackup]
where ration_card_id in
(
1247881,174772,
808454,2326154
)
ORDER BY CASE ration_card_id
    WHEN 1247881 THEN 0
    WHEN 174772 THEN 1
    WHEN 808454 THEN 2
    WHEN 2326154 THEN 3
END

说明显而易见但请注意,这种排序很可能不会被任何索引表示,因此不会被编入索引。

答案 2 :(得分:0)

在#temp表中插入您的ration_card_id,其中包含一个标识列。 将您的sql查询重写为:

SELECT a.*
FROM [MemberBackup].[dbo].[OriginalBackup] a
JOIN #temps b
on a.ration_card_id = b.ration_card_id
order by b.id