基于引用记录的自定义排序

时间:2019-04-17 07:03:11

标签: sql sql-server linq linq-to-entities c#-7.0

请考虑以下数据:

Id           F1          F2          Ref_ID
------------------------------------------- 
1            Nima        35           Null
2            Eli         33           Null
3            Arian       5            1
4            Ava         1            1
5            Arsha       3            2
6            Rozhan      30           1
7            Zhina       20           2

我想像这样对表进行排序:

Id           F1          F2          Ref_ID
------------------------------------------- 
1            Nima        35           Null
3            Arian       5            1
4            Ava         1            1    
6            Rozhan      30           1
2            Eli         33           Null
5            Arsha       3            2
7            Zhina       20           2

基于ID升序,引用的记录应放在参考记录下。

如何使用LINQSQL执行此操作。谢谢

4 个答案:

答案 0 :(得分:2)

在SQL中,您可以使用Ref_id和ID使用COALESCEISNULL对其进行排序。

然后使用IIFCASE WHEN来确保父ID在同一组Ref_id中排在首位。

SELECT Id, F1, F2, Ref_ID
FROM YourTable
ORDER BY COALESCE(Ref_ID, Id), IIF(Ref_ID IS NULL, 0, 1), Id;

db <>小提琴here

的测试

答案 1 :(得分:1)

这是一个更简单的解决方案:

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'HOST': 'xxx', #has been hide for this post
        'PORT': '1433',
        'NAME': 'BBL_Result',
        #'ODBC_DSN': 'BBL'
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
            'extra_params': "Persist Security Info=FALSE;server=xxx", #has been hide for this post

        },
    },
}

结果:

enter image description here

答案 2 :(得分:1)

使用LINQ,您可以这样做:

from i in data
orderby i.Ref_ID ?? i.Id
select i;

答案 3 :(得分:0)

另一种解决方案是在查询中添加额外的列,然后对该列进行排序

select t.*
from   ( select Id,
                F1,
                F2,
                Ref_ID,
                coalesce(Ref_ID, Id) as RefID_or_Id, 
                iif(Ref_ID is null, 0, 1) as Ref_ID_0_or_1
        from  YourTable
       ) t
order by t.RefID_or_Id,
         t.Ref_ID_0_or_1,   
         t.Id 

如果您的桌子很大,则应测试其中最适合您的解决方案