SQL-按问题排序

时间:2019-06-28 21:00:47

标签: sql

如何在字段的末尾添加其他订单,并按field_id排序记录,但订单的方式应与IN子句32015102、32015100、32015101、32015105中设置的方式相同。数字可以改变,并且可以增加或减少。

select * from dba.form_data where form_id = 207873 and field_id in (32015102,32015100, 32015101, 32015105 )
order by sub_id, array_number

2 个答案:

答案 0 :(得分:1)

IN子句包含一组无序的值。 IN (1,2,3)IN (3,2,1)被认为是相等的。

因此,您必须添加一些订购条件。对于您的情况,您需要32015102首先,32015100第二个,依此类推。用适当的排序键为DBMS提供值。例如:

select * 
from dba.form_data fd
join
(
  select 32015102 as value, 1 as sortkey
  union all
  select 32015100 as value, 2 as sortkey
  union all
  select 32015101 as value, 3 as sortkey
  union all
  select 32015105 as value, 4 as sortkey
) criteria on criteria.value = fd.field_id
where fd.form_id = 207873
order by criteria.sortkey;

答案 1 :(得分:0)

我的一个数据库上的TSQL解决方案:

WITH CTE AS
(
SELECT ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) AS a,
 * FROM (VALUES (21963), (21961), (27665)) AS X(b) 
)

SELECT tpb.AutoId FROM dbo.TPB AS tpb 
JOIN CTE ON CTE.b = tpb.AutoId
ORDER BY CTE.a

逐步:

行构造函数语法:SELECT * FORM(VALUES(1),(2),(3))X(a) 创建一个名为X的表,该表的a列包含1,2,3。

ROW_NUMBER():我需要行号来对数组进行最终排序。它需要一个over子句,所以我使用了伪OVER(ORDER BY(SELECT NULL)),它是无序的。

将其封装在CTE中,然后从目标表中选择并按所需顺序将其与CTE联接,然后使用相应的row_numbers对其进行排序。