如何根据sql server中的列值对结果排序

如何根据sql server中的列值对结果排序,sql,sql-server,Sql,Sql Server,我有以下类型的表: Id Parent_id Code Name market 1 NULL 1ex name 1 3 2 1 2ex name 2 3 3 1 3ex name 3 3 4 Null 4ex name 4 1 5 null 5ex name 5 3 6 4

我有以下类型的表:

Id  Parent_id  Code   Name       market
1    NULL      1ex    name 1       3
2    1         2ex    name 2       3
3    1         3ex    name 3       3
4    Null      4ex    name 4       1
5    null      5ex    name 5       3
6    4         6ex    name 6       3
我想从上表中选择
code
name
,以便按以下方式排序:

  • 基于市场id=3的市场
  • 父id
  • 亲子
  • 其他
  • 即,应首先显示id 1(父id),然后显示id 2和3(子id)。“parent_id”中的值来自列“id”

    到目前为止,我已经构建了以下查询,我觉得排序父代码和相关子代码有点困难

    select code,name from tbl_codes A
    order by  CASE WHEN(A.[Market] = 3) THEN 0 ELSE 1 END
    

    有人能帮我一下吗。

    你可以在你的专栏里写条件。尝试:

    SELECT  code ,
            name ,
            CASE WHEN ( A.[Market] = 3 ) THEN 0
                 ELSE 1
            END AS marketOrder ,
            CASE WHEN ( parent_id = 1 ) THEN 0
                 ELSE 1
            END AS parentOrder
    FROM    tbl_codes A
    ORDER BY parentOrder ,
            marketOrder
    
    试试这个

    SELECT  code ,
            name 
    FROM    tbl_codes A
    ORDER BY CASE WHEN ( A.[Market] = 3 ) THEN 0
                 ELSE 1
            END  ,
            CASE WHEN ( ISNULL(parent_id,0) = 1 ) THEN 0
                 ELSE 1
            END 
    

    递归CTE是构建父/子继承权的最佳方式,如下所示:

    -- Set up test data
    CREATE TABLE tbl_codes (id INT , Parent_id INT, Code VARCHAR(3), NAME VARCHAR(12), Market INT)
    INSERT tbl_codes 
    SELECT 1, NULL, '1ex', 'name 1', 3 UNION ALL
    SELECT 2, 1    , '2ex', 'name 2', 3 UNION ALL
    SELECT 3, 1    , '3ex', 'name 3', 3 UNION ALL
    SELECT 4, NULL , '4ex', 'name 4', 1 UNION ALL
    SELECT 5, NULL , '5ex', 'name 5', 3 UNION ALL
    SELECT 6, 4    , '6ex', 'name 6', 3
    
    CREATE VIEW [dbo].[View_ParentChild]
    AS
    -- Use a recursive CTE to build a parent/child heirarchy
    WITH  
      RecursiveCTE AS 
      (
         SELECT
           id,
           name,
           parent_id,
           Code,
           market,
           sort = id
         FROM
          tbl_codes
         WHERE
          parent_id IS NULL
         UNION ALL
         SELECT
           tbl_codes.id,
           tbl_codes.name,
           tbl_codes.parent_id,
           tbl_codes.Code,
           tbl_codes.market,
           sort = tbl_codes.parent_id
         FROM
          tbl_codes
          INNER JOIN RecursiveCTE
            ON tbl_codes.parent_id = RecursiveCTE.id
         WHERE
          tbl_codes.parent_id IS NOT NULL
      )
      SELECT
        Code,
        NAME,
        Market,
        Sort
      FROM
        RecursiveCTE
    
    GO
    
    SELECT
      *
    FROM
      View_ParentChild_v2
    ORDER BY
      CASE WHEN ( Market = 3 ) THEN 0
           ELSE 1
      END,
      sort 
    
    根据您的请求,我已将查询重构为视图

    要使用视图,请执行以下操作:

    SELECT
      *
    FROM
      dbo.View_ParentChild AS vpc
    ORDER BY
      CASE WHEN ( Market = 3 ) THEN 0
           ELSE 1
      END,
      sort 
    
    它给出了以下结果:

        Code    NAME    Market  Sort
        ----    ------  ------  ----
        1ex     name 1      3     1
        2ex     name 2      3     1
        3ex     name 3      3     1
        6ex     name 6      3     4
        5ex     name 5      3     5
        4ex     name 4      1     4
    
    要了解有关递归CTE的更多信息,请单击

    并且,根据要求,是视图的一个新版本,它不使用递归CTE

    CREATE VIEW [dbo].[View_ParentChild_v2]
    AS
    SELECT
      id,
      Code,
      market,
      sort
    FROM
    (
      SELECT
        id,
        name,
        parent_id,
        Code,
        market,
        sort = id
      FROM
        tbl_codes
      WHERE
        parent_id IS NULL
    
      UNION ALL
    
      SELECT
        tbl_codes.id,
        tbl_codes.name,
        tbl_codes.parent_id,
        tbl_codes.Code,
        tbl_codes.market,
        sort = tbl_codes.parent_id
      FROM
        tbl_codes
      WHERE
        tbl_codes.parent_id IS NOT NULL
    ) AS T
    
    GO
    
    用法如下:

    -- Set up test data
    CREATE TABLE tbl_codes (id INT , Parent_id INT, Code VARCHAR(3), NAME VARCHAR(12), Market INT)
    INSERT tbl_codes 
    SELECT 1, NULL, '1ex', 'name 1', 3 UNION ALL
    SELECT 2, 1    , '2ex', 'name 2', 3 UNION ALL
    SELECT 3, 1    , '3ex', 'name 3', 3 UNION ALL
    SELECT 4, NULL , '4ex', 'name 4', 1 UNION ALL
    SELECT 5, NULL , '5ex', 'name 5', 3 UNION ALL
    SELECT 6, 4    , '6ex', 'name 6', 3
    
    CREATE VIEW [dbo].[View_ParentChild]
    AS
    -- Use a recursive CTE to build a parent/child heirarchy
    WITH  
      RecursiveCTE AS 
      (
         SELECT
           id,
           name,
           parent_id,
           Code,
           market,
           sort = id
         FROM
          tbl_codes
         WHERE
          parent_id IS NULL
         UNION ALL
         SELECT
           tbl_codes.id,
           tbl_codes.name,
           tbl_codes.parent_id,
           tbl_codes.Code,
           tbl_codes.market,
           sort = tbl_codes.parent_id
         FROM
          tbl_codes
          INNER JOIN RecursiveCTE
            ON tbl_codes.parent_id = RecursiveCTE.id
         WHERE
          tbl_codes.parent_id IS NOT NULL
      )
      SELECT
        Code,
        NAME,
        Market,
        Sort
      FROM
        RecursiveCTE
    
    GO
    
    SELECT
      *
    FROM
      View_ParentChild_v2
    ORDER BY
      CASE WHEN ( Market = 3 ) THEN 0
           ELSE 1
      END,
      sort 
    

    注意:第一个版本使用递归CTE,可以处理几乎无限级别的父级/子级,而第二个版本只处理一个级别。

    试试这个。。从tbl_代码A中选择代码、名称,其中市场=3按Id、家长Id订购?谢谢您的回答!!但是父id并不总是1..ie.我必须以这样一种方式进行排序,即列出所有父id的代码,后跟子idsHi!!谢谢!!这就是我期待的!!但接下来要澄清的是,这可以用在一个视图中吗??因为我的应用程序会调用一个视图来显示这些代码,并且必须在一个视图上完成排序。请建议将重构作为一个视图。注意:
    视图不能有
    ORDER BY
    子句。只需在视图外进行排序。是否有方法在不使用递归CTE的情况下执行相同的操作??如果有,请建议