T-SQL选择,确保经理行位于员工行之前

T-SQL选择,确保经理行位于员工行之前,sql,sql-server,tsql,select,import,Sql,Sql Server,Tsql,Select,Import,这是我的问题。我有一个员工数据表,其中包含员工的用户名和经理的用户名,如下所示 ______________________________________________ | employee_username | employee_manager_username| ------------------------------------------------ tom01 | mark2 mark2 |

这是我的问题。我有一个员工数据表,其中包含员工的用户名和经理的用户名,如下所示

 ______________________________________________
| employee_username | employee_manager_username|
------------------------------------------------
  tom01             |         mark2
  mark2             |         bill3
我的问题是,如何进行选择,对于任何一行,包含employee\u manager\u用户名作为employee\u用户名的行位于前面?我想通过我的示例,我应该如何使[mark3,bill3]行位于[tom01,mark2]行之前

长话短说,我有一个第三方导入过程,警告找不到经理。能够在下属之前导入经理会使日志不那么健谈


非常感谢您在这方面提供的任何帮助。

我假设您有顶级经理,员工\经理\用户名=null。在这种情况下,可以使用递归公共表表达式,然后按级别排序:

;with CTE as (
    select t.employee_username, t.employee_manager_username, 1 as level
    from table1 as t
    where
          t.employee_manager_username is null or 
          t.employee_manager_username = t.employee_username

    union all

    select t.employee_username, t.employee_manager_username, c.level + 1 as level
    from table1 as t
        inner join CTE as c on c.employee_username = t.employee_manager_username
    where
        not (
            t.employee_manager_username is null or 
            t.employee_manager_username = t.employee_username
        )
)
select *
from CTE
order by level asc

要测试查询

表中是否存在没有管理器的记录?你怎么知道最高层的员工呢?@RomanPekar负责人会让自己或空值作为主管。看看我的回答,然后它抱怨说达到了最大递归限制。如果将限制提高到32767,则需要很长时间才能完成。我在运行时间的1:38停止了它。是的,这可能是因为在顶层可以有manager=user。更改了查询并添加了SQL fiddle示例,再次尝试Hanks,问题是我的员工列表中有两个国家:美国和加拿大。加拿大员工没有设置合适的employee_manager,因此导致查询行为不当。一旦我把他们排除在外,一切都很顺利。