查询:
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
答案 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